#Set working directory to appropriate folder for inputs and outputs on Google Drive

#Initialize

Load data

load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/all_data_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Preprocess_GEX/second_timepoint_merged.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Filtering_cDNA/resistant_lineage_lists.RData')

load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/cis_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/cocl2_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/dabtram_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/dabtram_both_times_final_lineages.RData')

#Plot cell cycle

load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/all_data_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Preprocess_GEX/second_timepoint_merged.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Filtering_cDNA/resistant_lineage_lists.RData')

load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/cis_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/cocl2_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/dabtram_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/dabtram_both_times_final_lineages.RData')

Markers within each first drug object to find subgroups (ie analogous to NGFR/EGFR)

need to make Idents metadata object which says if the cells are included in the combined lins list, or if they were filtered

#load('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/all_data_markers.RData')
cis_markers <- FindAllMarkers(cis, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~05s          
  |++                                                | 2 % ~04s          
  |++                                                | 3 % ~04s          
  |+++                                               | 4 % ~03s          
  |+++                                               | 6 % ~03s          
  |++++                                              | 7 % ~03s          
  |++++                                              | 8 % ~03s          
  |+++++                                             | 9 % ~03s          
  |+++++                                             | 10% ~03s          
  |++++++                                            | 11% ~03s          
  |+++++++                                           | 12% ~03s          
  |+++++++                                           | 13% ~03s          
  |++++++++                                          | 14% ~03s          
  |++++++++                                          | 16% ~03s          
  |+++++++++                                         | 17% ~03s          
  |+++++++++                                         | 18% ~03s          
  |++++++++++                                        | 19% ~03s          
  |++++++++++                                        | 20% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |++++++++++++                                      | 22% ~02s          
  |++++++++++++                                      | 23% ~02s          
  |+++++++++++++                                     | 24% ~02s          
  |+++++++++++++                                     | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |++++++++++++++                                    | 28% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |+++++++++++++++++                                 | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |++++++++++++++++++++++                            | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |+++++++++++++++++++++++                           | 44% ~02s          
  |+++++++++++++++++++++++                           | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |++++++++++++++++++++++++                          | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |++                                                | 3 % ~00s          
  |++++                                              | 7 % ~00s          
  |++++++                                            | 10% ~00s          
  |+++++++                                           | 14% ~00s          
  |+++++++++                                         | 17% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |+++++++++++++                                     | 24% ~00s          
  |++++++++++++++                                    | 28% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |++++++++++++++++++                                | 34% ~00s          
  |+++++++++++++++++++                               | 38% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |+++++++++++++++++++++++++                         | 48% ~00s          
  |++++++++++++++++++++++++++                        | 52% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~05s          
  |++                                                | 2 % ~04s          
  |++                                                | 4 % ~04s          
  |+++                                               | 5 % ~04s          
  |++++                                              | 6 % ~04s          
  |++++                                              | 7 % ~04s          
  |+++++                                             | 8 % ~04s          
  |+++++                                             | 10% ~04s          
  |++++++                                            | 11% ~04s          
  |+++++++                                           | 12% ~04s          
  |+++++++                                           | 13% ~04s          
  |++++++++                                          | 14% ~04s          
  |++++++++                                          | 16% ~04s          
  |+++++++++                                         | 17% ~04s          
  |++++++++++                                        | 18% ~03s          
  |++++++++++                                        | 19% ~03s          
  |+++++++++++                                       | 20% ~03s          
  |+++++++++++                                       | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |+++++++++++++                                     | 24% ~03s          
  |+++++++++++++                                     | 25% ~03s          
  |++++++++++++++                                    | 27% ~03s          
  |++++++++++++++                                    | 28% ~06s          
  |+++++++++++++++                                   | 29% ~05s          
  |++++++++++++++++                                  | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |+++++++++++++++++                                 | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |+++++++++++++++++++                               | 36% ~04s          
  |+++++++++++++++++++                               | 37% ~04s          
  |++++++++++++++++++++                              | 39% ~04s          
  |++++++++++++++++++++                              | 40% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |++++++++++++++++++++++                            | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |+++++++++++++++++++++++                           | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |+++++++++++++++++++++++++                         | 48% ~03s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~03s          
  |++++++++++++++++++++++++++                        | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 53% ~03s          
  |++++++++++++++++++++++++++++                      | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |+++++++++++++++++++++++++++++++                   | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 63% ~02s          
  |++++++++++++++++++++++++++++++++                  | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |++++++++++++++++++++++++++++++++++                | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=06s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02s          
  |++                                                | 3 % ~03s          
  |++                                                | 4 % ~02s          
  |+++                                               | 5 % ~02s          
  |++++                                              | 7 % ~02s          
  |++++                                              | 8 % ~02s          
  |+++++                                             | 9 % ~02s          
  |++++++                                            | 11% ~02s          
  |++++++                                            | 12% ~02s          
  |+++++++                                           | 13% ~02s          
  |++++++++                                          | 14% ~02s          
  |++++++++                                          | 16% ~02s          
  |+++++++++                                         | 17% ~02s          
  |++++++++++                                        | 18% ~02s          
  |++++++++++                                        | 20% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |++++++++++++                                      | 22% ~02s          
  |++++++++++++                                      | 24% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |++++++++++++++                                    | 26% ~02s          
  |++++++++++++++                                    | 28% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |++++++++++++++++                                  | 30% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |++++++++++++++++++++                              | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |++++++++++++++++++++++                            | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |++++++++++++++++++++++++                          | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~04s          
  |++                                                | 2 % ~04s          
  |++                                                | 3 % ~04s          
  |+++                                               | 5 % ~04s          
  |+++                                               | 6 % ~04s          
  |++++                                              | 7 % ~03s          
  |+++++                                             | 8 % ~03s          
  |+++++                                             | 9 % ~03s          
  |++++++                                            | 10% ~03s          
  |++++++                                            | 12% ~03s          
  |+++++++                                           | 13% ~03s          
  |+++++++                                           | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |+++++++++                                         | 16% ~03s          
  |+++++++++                                         | 17% ~03s          
  |++++++++++                                        | 19% ~03s          
  |++++++++++                                        | 20% ~03s          
  |+++++++++++                                       | 21% ~03s          
  |++++++++++++                                      | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |+++++++++++++                                     | 24% ~03s          
  |+++++++++++++                                     | 26% ~03s          
  |++++++++++++++                                    | 27% ~03s          
  |++++++++++++++                                    | 28% ~03s          
  |+++++++++++++++                                   | 29% ~03s          
  |++++++++++++++++                                  | 30% ~03s          
  |++++++++++++++++                                  | 31% ~03s          
  |+++++++++++++++++                                 | 33% ~03s          
  |+++++++++++++++++                                 | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |+++++++++++++++++++                               | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |++++++++++++++++++++                              | 38% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |+++++++++++++++++++++                             | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |+++++++++++++++++++++++                           | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |++++++++++++++++++++++++                          | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |+++++++++++++++++++++++++                         | 50% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |+++++++++++++++++++++++++++                       | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |++++++++++++++++++++++++++++                      | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |++++++++++++++++++++++++++++++++++                | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=05s  
Calculating cluster 5

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~07s          
  |++                                                | 2 % ~06s          
  |++                                                | 3 % ~06s          
  |+++                                               | 5 % ~06s          
  |+++                                               | 6 % ~06s          
  |++++                                              | 7 % ~06s          
  |+++++                                             | 8 % ~06s          
  |+++++                                             | 9 % ~06s          
  |++++++                                            | 10% ~06s          
  |++++++                                            | 12% ~06s          
  |+++++++                                           | 13% ~06s          
  |+++++++                                           | 14% ~06s          
  |++++++++                                          | 15% ~06s          
  |+++++++++                                         | 16% ~05s          
  |+++++++++                                         | 17% ~05s          
  |++++++++++                                        | 19% ~05s          
  |++++++++++                                        | 20% ~05s          
  |+++++++++++                                       | 21% ~05s          
  |++++++++++++                                      | 22% ~05s          
  |++++++++++++                                      | 23% ~05s          
  |+++++++++++++                                     | 24% ~05s          
  |+++++++++++++                                     | 26% ~05s          
  |++++++++++++++                                    | 27% ~05s          
  |++++++++++++++                                    | 28% ~05s          
  |+++++++++++++++                                   | 29% ~05s          
  |++++++++++++++++                                  | 30% ~05s          
  |++++++++++++++++                                  | 31% ~04s          
  |+++++++++++++++++                                 | 33% ~04s          
  |+++++++++++++++++                                 | 34% ~04s          
  |++++++++++++++++++                                | 35% ~04s          
  |+++++++++++++++++++                               | 36% ~04s          
  |+++++++++++++++++++                               | 37% ~04s          
  |++++++++++++++++++++                              | 38% ~04s          
  |++++++++++++++++++++                              | 40% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |+++++++++++++++++++++                             | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |++++++++++++++++++++++++                          | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |+++++++++++++++++++++++++                         | 50% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~03s          
  |+++++++++++++++++++++++++++                       | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 53% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |++++++++++++++++++++++++++++++                    | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |+++++++++++++++++++++++++++++++                   | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |++++++++++++++++++++++++++++++++++                | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=07s  
Calculating cluster 6

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03s          
  |++                                                | 2 % ~03s          
  |++                                                | 3 % ~03s          
  |+++                                               | 5 % ~03s          
  |+++                                               | 6 % ~03s          
  |++++                                              | 7 % ~03s          
  |++++                                              | 8 % ~02s          
  |+++++                                             | 9 % ~02s          
  |++++++                                            | 10% ~02s          
  |++++++                                            | 11% ~02s          
  |+++++++                                           | 12% ~02s          
  |+++++++                                           | 14% ~02s          
  |++++++++                                          | 15% ~02s          
  |++++++++                                          | 16% ~02s          
  |+++++++++                                         | 17% ~02s          
  |++++++++++                                        | 18% ~02s          
  |++++++++++                                        | 19% ~02s          
  |+++++++++++                                       | 20% ~02s          
  |+++++++++++                                       | 22% ~02s          
  |++++++++++++                                      | 23% ~02s          
  |++++++++++++                                      | 24% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |++++++++++++++                                    | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |+++++++++++++++                                   | 28% ~02s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |+++++++++++++++++++                               | 36% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |++++++++++++++++++++++                            | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |+++++++++++++++++++++++                           | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 7

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02s          
  |++                                                | 2 % ~02s          
  |++                                                | 3 % ~02s          
  |+++                                               | 4 % ~02s          
  |+++                                               | 5 % ~02s          
  |++++                                              | 7 % ~02s          
  |++++                                              | 8 % ~02s          
  |+++++                                             | 9 % ~02s          
  |+++++                                             | 10% ~02s          
  |++++++                                            | 11% ~02s          
  |+++++++                                           | 12% ~02s          
  |+++++++                                           | 13% ~02s          
  |++++++++                                          | 14% ~02s          
  |++++++++                                          | 15% ~02s          
  |+++++++++                                         | 16% ~02s          
  |+++++++++                                         | 18% ~02s          
  |++++++++++                                        | 19% ~02s          
  |++++++++++                                        | 20% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |+++++++++++                                       | 22% ~02s          
  |++++++++++++                                      | 23% ~02s          
  |+++++++++++++                                     | 24% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |++++++++++++++                                    | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |+++++++++++++++++++                               | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |++++++++++++++++++++                              | 38% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |+++++++++++++++++++++                             | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |++++++++++++++++++++++                            | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |++++++++++++++++++++++++                          | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 8

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~05s          
  |++                                                | 2 % ~05s          
  |++                                                | 3 % ~05s          
  |+++                                               | 4 % ~05s          
  |+++                                               | 5 % ~05s          
  |++++                                              | 6 % ~05s          
  |++++                                              | 7 % ~05s          
  |+++++                                             | 8 % ~05s          
  |+++++                                             | 9 % ~05s          
  |++++++                                            | 11% ~05s          
  |++++++                                            | 12% ~04s          
  |+++++++                                           | 13% ~04s          
  |+++++++                                           | 14% ~04s          
  |++++++++                                          | 15% ~04s          
  |++++++++                                          | 16% ~04s          
  |+++++++++                                         | 17% ~04s          
  |+++++++++                                         | 18% ~04s          
  |++++++++++                                        | 19% ~04s          
  |++++++++++                                        | 20% ~04s          
  |+++++++++++                                       | 21% ~04s          
  |++++++++++++                                      | 22% ~04s          
  |++++++++++++                                      | 23% ~04s          
  |+++++++++++++                                     | 24% ~04s          
  |+++++++++++++                                     | 25% ~04s          
  |++++++++++++++                                    | 26% ~04s          
  |++++++++++++++                                    | 27% ~04s          
  |+++++++++++++++                                   | 28% ~04s          
  |+++++++++++++++                                   | 29% ~04s          
  |++++++++++++++++                                  | 31% ~03s          
  |++++++++++++++++                                  | 32% ~03s          
  |+++++++++++++++++                                 | 33% ~03s          
  |+++++++++++++++++                                 | 34% ~03s          
  |++++++++++++++++++                                | 35% ~03s          
  |++++++++++++++++++                                | 36% ~03s          
  |+++++++++++++++++++                               | 37% ~03s          
  |+++++++++++++++++++                               | 38% ~03s          
  |++++++++++++++++++++                              | 39% ~03s          
  |++++++++++++++++++++                              | 40% ~03s          
  |+++++++++++++++++++++                             | 41% ~03s          
  |++++++++++++++++++++++                            | 42% ~03s          
  |++++++++++++++++++++++                            | 43% ~03s          
  |+++++++++++++++++++++++                           | 44% ~03s          
  |+++++++++++++++++++++++                           | 45% ~03s          
  |++++++++++++++++++++++++                          | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |+++++++++++++++++++++++++                         | 48% ~03s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |++++++++++++++++++++++++++                        | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |+++++++++++++++++++++++++++                       | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |++++++++++++++++++++++++++++                      | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |+++++++++++++++++++++++++++++                     | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |++++++++++++++++++++++++++++++                    | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 63% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |++++++++++++++++++++++++++++++++++                | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=05s  
cocl2_markers <- FindAllMarkers(cocl2, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03s          
  |++                                                | 2 % ~04s          
  |++                                                | 3 % ~04s          
  |+++                                               | 4 % ~04s          
  |+++                                               | 5 % ~04s          
  |++++                                              | 6 % ~03s          
  |++++                                              | 7 % ~03s          
  |+++++                                             | 9 % ~03s          
  |+++++                                             | 10% ~03s          
  |++++++                                            | 11% ~03s          
  |++++++                                            | 12% ~03s          
  |+++++++                                           | 13% ~03s          
  |+++++++                                           | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |++++++++                                          | 16% ~03s          
  |+++++++++                                         | 17% ~03s          
  |++++++++++                                        | 18% ~03s          
  |++++++++++                                        | 19% ~03s          
  |+++++++++++                                       | 20% ~03s          
  |+++++++++++                                       | 21% ~03s          
  |++++++++++++                                      | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |+++++++++++++                                     | 24% ~03s          
  |+++++++++++++                                     | 26% ~03s          
  |++++++++++++++                                    | 27% ~03s          
  |++++++++++++++                                    | 28% ~03s          
  |+++++++++++++++                                   | 29% ~03s          
  |+++++++++++++++                                   | 30% ~03s          
  |++++++++++++++++                                  | 31% ~03s          
  |++++++++++++++++                                  | 32% ~03s          
  |+++++++++++++++++                                 | 33% ~03s          
  |++++++++++++++++++                                | 34% ~03s          
  |++++++++++++++++++                                | 35% ~02s          
  |+++++++++++++++++++                               | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |++++++++++++++++++++                              | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |+++++++++++++++++++++                             | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |++++++++++++++++++++++                            | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |+++++++++++++++++++++++                           | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |++++++++++++++++++++++++                          | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |+++++++++++++++++++++++++                         | 50% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |+++++++++++++++++++++++++++                       | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |++++++++++++++++++++++++++++++                    | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 2 % ~01s          
  |++                                                | 4 % ~01s          
  |+++                                               | 5 % ~01s          
  |++++                                              | 6 % ~01s          
  |++++                                              | 8 % ~01s          
  |+++++                                             | 9 % ~01s          
  |+++++                                             | 10% ~01s          
  |++++++                                            | 11% ~01s          
  |+++++++                                           | 12% ~01s          
  |+++++++                                           | 14% ~01s          
  |++++++++                                          | 15% ~01s          
  |+++++++++                                         | 16% ~01s          
  |+++++++++                                         | 18% ~01s          
  |++++++++++                                        | 19% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |++++++++++++                                      | 22% ~01s          
  |++++++++++++                                      | 24% ~01s          
  |+++++++++++++                                     | 25% ~01s          
  |++++++++++++++                                    | 26% ~01s          
  |++++++++++++++                                    | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |+++++++++++++++++                                 | 32% ~01s          
  |+++++++++++++++++                                 | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |+++++++++++++++++++                               | 36% ~01s          
  |+++++++++++++++++++                               | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |++++++++++++++++++++++                            | 42% ~01s          
  |++++++++++++++++++++++                            | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 46% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |++++++++++++++++++++++++++++++++++                | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02s          
  |++                                                | 3 % ~01m 03s      
  |++                                                | 4 % ~42s          
  |+++                                               | 5 % ~32s          
  |++++                                              | 7 % ~25s          
  |++++                                              | 8 % ~21s          
  |+++++                                             | 9 % ~18s          
  |++++++                                            | 11% ~16s          
  |++++++                                            | 12% ~14s          
  |+++++++                                           | 13% ~13s          
  |++++++++                                          | 14% ~11s          
  |++++++++                                          | 16% ~10s          
  |+++++++++                                         | 17% ~10s          
  |++++++++++                                        | 18% ~09s          
  |++++++++++                                        | 20% ~08s          
  |+++++++++++                                       | 21% ~08s          
  |++++++++++++                                      | 22% ~07s          
  |++++++++++++                                      | 24% ~07s          
  |+++++++++++++                                     | 25% ~06s          
  |++++++++++++++                                    | 26% ~06s          
  |++++++++++++++                                    | 28% ~06s          
  |+++++++++++++++                                   | 29% ~05s          
  |++++++++++++++++                                  | 30% ~05s          
  |++++++++++++++++                                  | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |++++++++++++++++++                                | 34% ~04s          
  |++++++++++++++++++                                | 36% ~04s          
  |+++++++++++++++++++                               | 37% ~04s          
  |++++++++++++++++++++                              | 38% ~04s          
  |++++++++++++++++++++                              | 39% ~04s          
  |+++++++++++++++++++++                             | 41% ~03s          
  |++++++++++++++++++++++                            | 42% ~03s          
  |++++++++++++++++++++++                            | 43% ~03s          
  |+++++++++++++++++++++++                           | 45% ~03s          
  |++++++++++++++++++++++++                          | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |+++++++++++++++++++++++++                         | 50% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |+++++++++++++++++++++++++++                       | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |+++++++++++++++++++++++++++++                     | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |+++++++++++++++++++++++++++++++                   | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 63% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~04s          
  |++                                                | 2 % ~04s          
  |++                                                | 3 % ~04s          
  |+++                                               | 4 % ~04s          
  |+++                                               | 5 % ~04s          
  |++++                                              | 7 % ~04s          
  |++++                                              | 8 % ~04s          
  |+++++                                             | 9 % ~04s          
  |+++++                                             | 10% ~04s          
  |++++++                                            | 11% ~03s          
  |+++++++                                           | 12% ~03s          
  |+++++++                                           | 13% ~03s          
  |++++++++                                          | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |+++++++++                                         | 16% ~03s          
  |+++++++++                                         | 18% ~03s          
  |++++++++++                                        | 19% ~03s          
  |++++++++++                                        | 20% ~03s          
  |+++++++++++                                       | 21% ~03s          
  |+++++++++++                                       | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |+++++++++++++                                     | 24% ~03s          
  |+++++++++++++                                     | 25% ~03s          
  |++++++++++++++                                    | 26% ~03s          
  |++++++++++++++                                    | 27% ~03s          
  |+++++++++++++++                                   | 29% ~03s          
  |+++++++++++++++                                   | 30% ~03s          
  |++++++++++++++++                                  | 31% ~03s          
  |++++++++++++++++                                  | 32% ~03s          
  |+++++++++++++++++                                 | 33% ~03s          
  |++++++++++++++++++                                | 34% ~03s          
  |++++++++++++++++++                                | 35% ~03s          
  |+++++++++++++++++++                               | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |++++++++++++++++++++                              | 38% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |+++++++++++++++++++++                             | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |++++++++++++++++++++++                            | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |++++++++++++++++++++++++                          | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |+++++++++++++++++++++++++                         | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |++++++++++++++++++++++++++                        | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |+++++++++++++++++++++++++++                       | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |+++++++++++++++++++++++++++++++                   | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04s  
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02m 19s      
  |+                                                 | 2 % ~01m 10s      
  |++                                                | 3 % ~47s          
  |++                                                | 4 % ~36s          
  |+++                                               | 5 % ~29s          
  |+++                                               | 6 % ~24s          
  |++++                                              | 7 % ~21s          
  |++++                                              | 8 % ~18s          
  |+++++                                             | 9 % ~16s          
  |+++++                                             | 10% ~15s          
  |++++++                                            | 11% ~13s          
  |++++++                                            | 12% ~12s          
  |+++++++                                           | 13% ~11s          
  |+++++++                                           | 14% ~11s          
  |++++++++                                          | 15% ~10s          
  |++++++++                                          | 16% ~09s          
  |+++++++++                                         | 17% ~09s          
  |+++++++++                                         | 18% ~08s          
  |++++++++++                                        | 19% ~08s          
  |++++++++++                                        | 20% ~08s          
  |+++++++++++                                       | 21% ~07s          
  |+++++++++++                                       | 22% ~07s          
  |++++++++++++                                      | 23% ~07s          
  |++++++++++++                                      | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |+++++++++++++                                     | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |++++++++++++++                                    | 28% ~05s          
  |+++++++++++++++                                   | 29% ~05s          
  |+++++++++++++++                                   | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |++++++++++++++++                                  | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |+++++++++++++++++                                 | 34% ~04s          
  |++++++++++++++++++                                | 35% ~04s          
  |++++++++++++++++++                                | 36% ~04s          
  |+++++++++++++++++++                               | 37% ~04s          
  |+++++++++++++++++++                               | 38% ~04s          
  |++++++++++++++++++++                              | 39% ~04s          
  |++++++++++++++++++++                              | 40% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |+++++++++++++++++++++                             | 42% ~03s          
  |++++++++++++++++++++++                            | 43% ~03s          
  |++++++++++++++++++++++                            | 44% ~03s          
  |+++++++++++++++++++++++                           | 45% ~03s          
  |+++++++++++++++++++++++                           | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |++++++++++++++++++++++++                          | 48% ~03s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |+++++++++++++++++++++++++                         | 50% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~03s          
  |++++++++++++++++++++++++++                        | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |+++++++++++++++++++++++++++                       | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |++++++++++++++++++++++++++++                      | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |+++++++++++++++++++++++++++++                     | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |++++++++++++++++++++++++++++++                    | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |+++++++++++++++++++++++++++++++                   | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 63% ~02s          
  |++++++++++++++++++++++++++++++++                  | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04s  
Calculating cluster 5

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~13s          
  |++                                                | 3 % ~08s          
  |++                                                | 4 % ~06s          
  |+++                                               | 5 % ~05s          
  |++++                                              | 6 % ~04s          
  |++++                                              | 8 % ~04s          
  |+++++                                             | 9 % ~04s          
  |++++++                                            | 10% ~03s          
  |++++++                                            | 11% ~03s          
  |+++++++                                           | 13% ~03s          
  |+++++++                                           | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |+++++++++                                         | 16% ~03s          
  |+++++++++                                         | 18% ~03s          
  |++++++++++                                        | 19% ~03s          
  |+++++++++++                                       | 20% ~03s          
  |+++++++++++                                       | 22% ~03s          
  |++++++++++++                                      | 23% ~02s          
  |+++++++++++++                                     | 24% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |++++++++++++++                                    | 28% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |++++++++++++++++                                  | 30% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |+++++++++++++++++++++                             | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |+++++++++++++++++++++++                           | 44% ~02s          
  |+++++++++++++++++++++++                           | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |+++++++++++++++++++++++++                         | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 6

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02s          
  |++                                                | 2 % ~02s          
  |++                                                | 3 % ~02s          
  |+++                                               | 4 % ~02s          
  |+++                                               | 5 % ~02s          
  |++++                                              | 6 % ~02s          
  |++++                                              | 7 % ~02s          
  |+++++                                             | 9 % ~02s          
  |+++++                                             | 10% ~02s          
  |++++++                                            | 11% ~02s          
  |++++++                                            | 12% ~02s          
  |+++++++                                           | 13% ~02s          
  |+++++++                                           | 14% ~02s          
  |++++++++                                          | 15% ~02s          
  |++++++++                                          | 16% ~02s          
  |+++++++++                                         | 17% ~02s          
  |++++++++++                                        | 18% ~02s          
  |++++++++++                                        | 19% ~02s          
  |+++++++++++                                       | 20% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |++++++++++++                                      | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |+++++++++++++                                     | 24% ~01s          
  |+++++++++++++                                     | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |++++++++++++++                                    | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |++++++++++++++++                                  | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |+++++++++++++++++++                               | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |++++++++++++++++++++                              | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |+++++++++++++++++++++                             | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |++++++++++++++++++++++                            | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster 7

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~11s          
  |+                                                 | 2 % ~11s          
  |++                                                | 3 % ~11s          
  |++                                                | 4 % ~11s          
  |+++                                               | 5 % ~11s          
  |+++                                               | 6 % ~11s          
  |++++                                              | 7 % ~11s          
  |++++                                              | 8 % ~11s          
  |+++++                                             | 9 % ~11s          
  |+++++                                             | 10% ~11s          
  |++++++                                            | 11% ~10s          
  |++++++                                            | 12% ~10s          
  |+++++++                                           | 13% ~10s          
  |+++++++                                           | 14% ~10s          
  |++++++++                                          | 15% ~10s          
  |++++++++                                          | 16% ~10s          
  |+++++++++                                         | 17% ~10s          
  |+++++++++                                         | 18% ~10s          
  |++++++++++                                        | 19% ~10s          
  |++++++++++                                        | 20% ~09s          
  |+++++++++++                                       | 21% ~09s          
  |+++++++++++                                       | 22% ~09s          
  |++++++++++++                                      | 23% ~10s          
  |++++++++++++                                      | 24% ~10s          
  |+++++++++++++                                     | 25% ~10s          
  |+++++++++++++                                     | 26% ~09s          
  |++++++++++++++                                    | 27% ~09s          
  |++++++++++++++                                    | 28% ~09s          
  |+++++++++++++++                                   | 29% ~09s          
  |+++++++++++++++                                   | 30% ~09s          
  |++++++++++++++++                                  | 31% ~09s          
  |++++++++++++++++                                  | 32% ~09s          
  |+++++++++++++++++                                 | 33% ~08s          
  |+++++++++++++++++                                 | 34% ~08s          
  |++++++++++++++++++                                | 35% ~08s          
  |++++++++++++++++++                                | 36% ~08s          
  |+++++++++++++++++++                               | 37% ~08s          
  |+++++++++++++++++++                               | 38% ~08s          
  |++++++++++++++++++++                              | 39% ~08s          
  |++++++++++++++++++++                              | 40% ~07s          
  |+++++++++++++++++++++                             | 41% ~07s          
  |+++++++++++++++++++++                             | 42% ~07s          
  |++++++++++++++++++++++                            | 43% ~07s          
  |++++++++++++++++++++++                            | 44% ~07s          
  |+++++++++++++++++++++++                           | 45% ~07s          
  |+++++++++++++++++++++++                           | 46% ~07s          
  |++++++++++++++++++++++++                          | 47% ~06s          
  |++++++++++++++++++++++++                          | 48% ~06s          
  |+++++++++++++++++++++++++                         | 49% ~06s          
  |+++++++++++++++++++++++++                         | 50% ~06s          
  |++++++++++++++++++++++++++                        | 51% ~06s          
  |++++++++++++++++++++++++++                        | 52% ~06s          
  |+++++++++++++++++++++++++++                       | 53% ~06s          
  |+++++++++++++++++++++++++++                       | 54% ~06s          
  |++++++++++++++++++++++++++++                      | 55% ~05s          
  |++++++++++++++++++++++++++++                      | 56% ~05s          
  |+++++++++++++++++++++++++++++                     | 57% ~05s          
  |+++++++++++++++++++++++++++++                     | 58% ~05s          
  |++++++++++++++++++++++++++++++                    | 59% ~05s          
  |++++++++++++++++++++++++++++++                    | 60% ~05s          
  |+++++++++++++++++++++++++++++++                   | 61% ~05s          
  |+++++++++++++++++++++++++++++++                   | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~04s          
  |++++++++++++++++++++++++++++++++                  | 64% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~04s          
  |++++++++++++++++++++++++++++++++++                | 67% ~04s          
  |++++++++++++++++++++++++++++++++++                | 68% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=12s  
Calculating cluster 8

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~04s          
  |++                                                | 2 % ~04s          
  |++                                                | 3 % ~04s          
  |+++                                               | 5 % ~04s          
  |+++                                               | 6 % ~04s          
  |++++                                              | 7 % ~04s          
  |+++++                                             | 8 % ~04s          
  |+++++                                             | 9 % ~04s          
  |++++++                                            | 10% ~04s          
  |++++++                                            | 11% ~03s          
  |+++++++                                           | 13% ~03s          
  |+++++++                                           | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |+++++++++                                         | 16% ~03s          
  |+++++++++                                         | 17% ~03s          
  |++++++++++                                        | 18% ~03s          
  |++++++++++                                        | 20% ~03s          
  |+++++++++++                                       | 21% ~03s          
  |+++++++++++                                       | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |+++++++++++++                                     | 24% ~03s          
  |+++++++++++++                                     | 25% ~03s          
  |++++++++++++++                                    | 26% ~03s          
  |++++++++++++++                                    | 28% ~03s          
  |+++++++++++++++                                   | 29% ~03s          
  |+++++++++++++++                                   | 30% ~03s          
  |++++++++++++++++                                  | 31% ~03s          
  |+++++++++++++++++                                 | 32% ~03s          
  |+++++++++++++++++                                 | 33% ~03s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |+++++++++++++++++++++                             | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |++++++++++++++++++++++                            | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |+++++++++++++++++++++++                           | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |+++++++++++++++++++++++++                         | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |++++++++++++++++++++++++++                        | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |++++++++++++++++++++++++++++++                    | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04s  
Calculating cluster 9

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~08s          
  |++                                                | 2 % ~08s          
  |++                                                | 3 % ~08s          
  |+++                                               | 4 % ~08s          
  |+++                                               | 5 % ~08s          
  |++++                                              | 6 % ~08s          
  |++++                                              | 7 % ~07s          
  |+++++                                             | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |++++++                                            | 10% ~07s          
  |++++++                                            | 11% ~07s          
  |+++++++                                           | 12% ~07s          
  |+++++++                                           | 13% ~07s          
  |++++++++                                          | 14% ~07s          
  |++++++++                                          | 15% ~07s          
  |+++++++++                                         | 16% ~07s          
  |+++++++++                                         | 17% ~07s          
  |++++++++++                                        | 18% ~07s          
  |++++++++++                                        | 19% ~06s          
  |+++++++++++                                       | 20% ~06s          
  |+++++++++++                                       | 21% ~06s          
  |++++++++++++                                      | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |+++++++++++++                                     | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |++++++++++++++                                    | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |+++++++++++++++                                   | 28% ~06s          
  |+++++++++++++++                                   | 29% ~06s          
  |++++++++++++++++                                  | 30% ~06s          
  |++++++++++++++++                                  | 31% ~05s          
  |+++++++++++++++++                                 | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |++++++++++++++++++                                | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |+++++++++++++++++++                               | 36% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |++++++++++++++++++++                              | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |+++++++++++++++++++++                             | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |++++++++++++++++++++++                            | 42% ~05s          
  |++++++++++++++++++++++                            | 43% ~05s          
  |+++++++++++++++++++++++                           | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |+++++++++++++++++++++++++                         | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |++++++++++++++++++++++++++++                      | 56% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
dabtram_markers <- FindAllMarkers(dabtram, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~04s          
  |++                                                | 2 % ~03s          
  |++                                                | 3 % ~03s          
  |+++                                               | 5 % ~03s          
  |+++                                               | 6 % ~03s          
  |++++                                              | 7 % ~03s          
  |++++                                              | 8 % ~03s          
  |+++++                                             | 9 % ~03s          
  |++++++                                            | 10% ~03s          
  |++++++                                            | 11% ~03s          
  |+++++++                                           | 12% ~03s          
  |+++++++                                           | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |++++++++                                          | 16% ~03s          
  |+++++++++                                         | 17% ~03s          
  |++++++++++                                        | 18% ~03s          
  |++++++++++                                        | 19% ~03s          
  |+++++++++++                                       | 20% ~03s          
  |+++++++++++                                       | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |++++++++++++                                      | 24% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |++++++++++++++                                    | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |+++++++++++++++                                   | 28% ~02s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |+++++++++++++++++++                               | 36% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |++++++++++++++++++++++                            | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |+++++++++++++++++++++++                           | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |++++++++++++++++++++++++                          | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |+++++++++++++++++++++++++                         | 50% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |+++++++++++++++++++++++++++                       | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~04s          
  |++                                                | 2 % ~04s          
  |++                                                | 3 % ~04s          
  |+++                                               | 4 % ~04s          
  |+++                                               | 5 % ~03s          
  |++++                                              | 6 % ~03s          
  |++++                                              | 7 % ~03s          
  |+++++                                             | 8 % ~03s          
  |+++++                                             | 9 % ~03s          
  |++++++                                            | 10% ~03s          
  |++++++                                            | 11% ~03s          
  |+++++++                                           | 12% ~03s          
  |+++++++                                           | 13% ~03s          
  |++++++++                                          | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |+++++++++                                         | 16% ~03s          
  |+++++++++                                         | 17% ~03s          
  |++++++++++                                        | 18% ~03s          
  |++++++++++                                        | 19% ~03s          
  |+++++++++++                                       | 20% ~03s          
  |+++++++++++                                       | 21% ~03s          
  |++++++++++++                                      | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |+++++++++++++                                     | 24% ~03s          
  |+++++++++++++                                     | 26% ~03s          
  |++++++++++++++                                    | 27% ~03s          
  |++++++++++++++                                    | 28% ~03s          
  |+++++++++++++++                                   | 29% ~03s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |+++++++++++++++++                                 | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |++++++++++++++++++                                | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |+++++++++++++++++++++                             | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |++++++++++++++++++++++                            | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |+++++++++++++++++++++++                           | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |++++++++++++++++++++++++                          | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |+++++++++++++++++++++++++                         | 50% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |+++++++++++++++++++++++++++                       | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |++++++++++++++++++++++++++++++++++                | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03s          
  |++                                                | 2 % ~04s          
  |++                                                | 3 % ~04s          
  |+++                                               | 5 % ~04s          
  |+++                                               | 6 % ~04s          
  |++++                                              | 7 % ~04s          
  |+++++                                             | 8 % ~03s          
  |+++++                                             | 9 % ~03s          
  |++++++                                            | 10% ~03s          
  |++++++                                            | 11% ~03s          
  |+++++++                                           | 13% ~03s          
  |+++++++                                           | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |+++++++++                                         | 16% ~03s          
  |+++++++++                                         | 17% ~03s          
  |++++++++++                                        | 18% ~03s          
  |++++++++++                                        | 20% ~03s          
  |+++++++++++                                       | 21% ~03s          
  |+++++++++++                                       | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |+++++++++++++                                     | 24% ~03s          
  |+++++++++++++                                     | 25% ~03s          
  |++++++++++++++                                    | 26% ~03s          
  |++++++++++++++                                    | 28% ~03s          
  |+++++++++++++++                                   | 29% ~03s          
  |+++++++++++++++                                   | 30% ~03s          
  |++++++++++++++++                                  | 31% ~03s          
  |+++++++++++++++++                                 | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |+++++++++++++++++++++                             | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |++++++++++++++++++++++                            | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |+++++++++++++++++++++++                           | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |+++++++++++++++++++++++++                         | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |++++++++++++++++++++++++++                        | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03s          
  |++                                                | 2 % ~02s          
  |++                                                | 4 % ~02s          
  |+++                                               | 5 % ~02s          
  |++++                                              | 6 % ~02s          
  |++++                                              | 7 % ~02s          
  |+++++                                             | 9 % ~02s          
  |+++++                                             | 10% ~02s          
  |++++++                                            | 11% ~02s          
  |+++++++                                           | 12% ~02s          
  |+++++++                                           | 14% ~02s          
  |++++++++                                          | 15% ~02s          
  |+++++++++                                         | 16% ~02s          
  |+++++++++                                         | 17% ~02s          
  |++++++++++                                        | 19% ~02s          
  |++++++++++                                        | 20% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |++++++++++++                                      | 22% ~02s          
  |++++++++++++                                      | 23% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |+++++++++++++                                     | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |+++++++++++++++                                   | 28% ~02s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |+++++++++++++++++                                 | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 35% ~01s          
  |++++++++++++++++++                                | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |++++++++++++++++++++                              | 38% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |+++++++++++++++++++++                             | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |+++++++++++++++++++++++                           | 44% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~08s          
  |++                                                | 2 % ~08s          
  |++                                                | 3 % ~08s          
  |+++                                               | 4 % ~07s          
  |+++                                               | 5 % ~07s          
  |++++                                              | 6 % ~07s          
  |++++                                              | 7 % ~07s          
  |+++++                                             | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |++++++                                            | 10% ~07s          
  |++++++                                            | 11% ~07s          
  |+++++++                                           | 12% ~07s          
  |+++++++                                           | 13% ~07s          
  |++++++++                                          | 14% ~06s          
  |++++++++                                          | 15% ~06s          
  |+++++++++                                         | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |++++++++++                                        | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |+++++++++++                                       | 20% ~06s          
  |+++++++++++                                       | 21% ~06s          
  |++++++++++++                                      | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |+++++++++++++                                     | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |++++++++++++++                                    | 26% ~06s          
  |++++++++++++++                                    | 27% ~05s          
  |+++++++++++++++                                   | 28% ~05s          
  |+++++++++++++++                                   | 29% ~05s          
  |++++++++++++++++                                  | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |+++++++++++++++++                                 | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |++++++++++++++++++                                | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |+++++++++++++++++++                               | 36% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |++++++++++++++++++++                              | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |+++++++++++++++++++++                             | 40% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |++++++++++++++++++++++                            | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |+++++++++++++++++++++++++                         | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
Calculating cluster 5

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~06s          
  |++                                                | 2 % ~06s          
  |++                                                | 3 % ~06s          
  |+++                                               | 4 % ~06s          
  |+++                                               | 5 % ~06s          
  |++++                                              | 6 % ~06s          
  |++++                                              | 7 % ~06s          
  |+++++                                             | 8 % ~06s          
  |+++++                                             | 9 % ~05s          
  |++++++                                            | 10% ~05s          
  |++++++                                            | 11% ~05s          
  |+++++++                                           | 12% ~05s          
  |+++++++                                           | 13% ~05s          
  |++++++++                                          | 14% ~05s          
  |++++++++                                          | 15% ~05s          
  |+++++++++                                         | 16% ~05s          
  |+++++++++                                         | 17% ~05s          
  |++++++++++                                        | 18% ~05s          
  |++++++++++                                        | 19% ~05s          
  |+++++++++++                                       | 20% ~05s          
  |+++++++++++                                       | 21% ~05s          
  |++++++++++++                                      | 22% ~05s          
  |++++++++++++                                      | 23% ~05s          
  |+++++++++++++                                     | 24% ~05s          
  |+++++++++++++                                     | 26% ~04s          
  |++++++++++++++                                    | 27% ~04s          
  |++++++++++++++                                    | 28% ~04s          
  |+++++++++++++++                                   | 29% ~04s          
  |+++++++++++++++                                   | 30% ~04s          
  |++++++++++++++++                                  | 31% ~04s          
  |++++++++++++++++                                  | 32% ~04s          
  |+++++++++++++++++                                 | 33% ~04s          
  |+++++++++++++++++                                 | 34% ~04s          
  |++++++++++++++++++                                | 35% ~04s          
  |++++++++++++++++++                                | 36% ~04s          
  |+++++++++++++++++++                               | 37% ~04s          
  |+++++++++++++++++++                               | 38% ~04s          
  |++++++++++++++++++++                              | 39% ~04s          
  |++++++++++++++++++++                              | 40% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |+++++++++++++++++++++                             | 42% ~03s          
  |++++++++++++++++++++++                            | 43% ~03s          
  |++++++++++++++++++++++                            | 44% ~03s          
  |+++++++++++++++++++++++                           | 45% ~03s          
  |+++++++++++++++++++++++                           | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |++++++++++++++++++++++++                          | 48% ~03s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |+++++++++++++++++++++++++                         | 50% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~03s          
  |+++++++++++++++++++++++++++                       | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 53% ~03s          
  |++++++++++++++++++++++++++++                      | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |+++++++++++++++++++++++++++++                     | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |++++++++++++++++++++++++++++++                    | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |+++++++++++++++++++++++++++++++                   | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 63% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |++++++++++++++++++++++++++++++++++                | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=06s  
Calculating cluster 6

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~10s          
  |++                                                | 2 % ~10s          
  |++                                                | 3 % ~09s          
  |+++                                               | 4 % ~09s          
  |+++                                               | 5 % ~09s          
  |++++                                              | 6 % ~09s          
  |++++                                              | 7 % ~09s          
  |+++++                                             | 8 % ~09s          
  |+++++                                             | 9 % ~09s          
  |++++++                                            | 10% ~09s          
  |++++++                                            | 11% ~09s          
  |+++++++                                           | 12% ~09s          
  |+++++++                                           | 13% ~08s          
  |++++++++                                          | 14% ~08s          
  |++++++++                                          | 15% ~08s          
  |+++++++++                                         | 16% ~08s          
  |+++++++++                                         | 17% ~08s          
  |++++++++++                                        | 18% ~08s          
  |++++++++++                                        | 19% ~08s          
  |+++++++++++                                       | 20% ~08s          
  |+++++++++++                                       | 21% ~08s          
  |++++++++++++                                      | 22% ~08s          
  |++++++++++++                                      | 23% ~08s          
  |+++++++++++++                                     | 24% ~07s          
  |+++++++++++++                                     | 25% ~07s          
  |++++++++++++++                                    | 26% ~07s          
  |++++++++++++++                                    | 27% ~07s          
  |+++++++++++++++                                   | 28% ~07s          
  |+++++++++++++++                                   | 29% ~07s          
  |++++++++++++++++                                  | 30% ~07s          
  |++++++++++++++++                                  | 31% ~07s          
  |+++++++++++++++++                                 | 32% ~07s          
  |+++++++++++++++++                                 | 33% ~07s          
  |++++++++++++++++++                                | 34% ~06s          
  |++++++++++++++++++                                | 35% ~06s          
  |+++++++++++++++++++                               | 36% ~06s          
  |+++++++++++++++++++                               | 37% ~06s          
  |++++++++++++++++++++                              | 38% ~06s          
  |++++++++++++++++++++                              | 39% ~06s          
  |+++++++++++++++++++++                             | 40% ~06s          
  |+++++++++++++++++++++                             | 41% ~06s          
  |++++++++++++++++++++++                            | 42% ~06s          
  |++++++++++++++++++++++                            | 43% ~06s          
  |+++++++++++++++++++++++                           | 44% ~05s          
  |+++++++++++++++++++++++                           | 45% ~05s          
  |++++++++++++++++++++++++                          | 46% ~05s          
  |++++++++++++++++++++++++                          | 47% ~05s          
  |+++++++++++++++++++++++++                         | 48% ~05s          
  |+++++++++++++++++++++++++                         | 49% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~05s          
  |++++++++++++++++++++++++++                        | 52% ~05s          
  |+++++++++++++++++++++++++++                       | 53% ~05s          
  |+++++++++++++++++++++++++++                       | 54% ~05s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |++++++++++++++++++++++++++++                      | 56% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~04s          
  |+++++++++++++++++++++++++++++                     | 58% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |++++++++++++++++++++++++++++++                    | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 61% ~04s          
  |+++++++++++++++++++++++++++++++                   | 62% ~04s          
  |++++++++++++++++++++++++++++++++                  | 63% ~04s          
  |++++++++++++++++++++++++++++++++                  | 64% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=10s  
all_data.markers <- FindAllMarkers(all_data, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25) 
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~33s          
  |++                                                | 2 % ~33s          
  |++                                                | 3 % ~32s          
  |+++                                               | 4 % ~31s          
  |+++                                               | 5 % ~31s          
  |++++                                              | 6 % ~30s          
  |++++                                              | 7 % ~29s          
  |+++++                                             | 9 % ~28s          
  |+++++                                             | 10% ~28s          
  |++++++                                            | 11% ~28s          
  |++++++                                            | 12% ~27s          
  |+++++++                                           | 13% ~27s          
  |+++++++                                           | 14% ~27s          
  |++++++++                                          | 15% ~27s          
  |++++++++                                          | 16% ~26s          
  |+++++++++                                         | 17% ~26s          
  |++++++++++                                        | 18% ~26s          
  |++++++++++                                        | 19% ~26s          
  |+++++++++++                                       | 20% ~25s          
  |+++++++++++                                       | 21% ~28s          
  |++++++++++++                                      | 22% ~27s          
  |++++++++++++                                      | 23% ~27s          
  |+++++++++++++                                     | 24% ~26s          
  |+++++++++++++                                     | 26% ~26s          
  |++++++++++++++                                    | 27% ~26s          
  |++++++++++++++                                    | 28% ~25s          
  |+++++++++++++++                                   | 29% ~25s          
  |+++++++++++++++                                   | 30% ~24s          
  |++++++++++++++++                                  | 31% ~24s          
  |++++++++++++++++                                  | 32% ~23s          
  |+++++++++++++++++                                 | 33% ~23s          
  |++++++++++++++++++                                | 34% ~22s          
  |++++++++++++++++++                                | 35% ~22s          
  |+++++++++++++++++++                               | 36% ~22s          
  |+++++++++++++++++++                               | 37% ~21s          
  |++++++++++++++++++++                              | 38% ~21s          
  |++++++++++++++++++++                              | 39% ~20s          
  |+++++++++++++++++++++                             | 40% ~20s          
  |+++++++++++++++++++++                             | 41% ~20s          
  |++++++++++++++++++++++                            | 43% ~19s          
  |++++++++++++++++++++++                            | 44% ~19s          
  |+++++++++++++++++++++++                           | 45% ~19s          
  |+++++++++++++++++++++++                           | 46% ~18s          
  |++++++++++++++++++++++++                          | 47% ~18s          
  |++++++++++++++++++++++++                          | 48% ~18s          
  |+++++++++++++++++++++++++                         | 49% ~17s          
  |+++++++++++++++++++++++++                         | 50% ~17s          
  |++++++++++++++++++++++++++                        | 51% ~16s          
  |+++++++++++++++++++++++++++                       | 52% ~16s          
  |+++++++++++++++++++++++++++                       | 53% ~16s          
  |++++++++++++++++++++++++++++                      | 54% ~15s          
  |++++++++++++++++++++++++++++                      | 55% ~15s          
  |+++++++++++++++++++++++++++++                     | 56% ~15s          
  |+++++++++++++++++++++++++++++                     | 57% ~14s          
  |++++++++++++++++++++++++++++++                    | 59% ~14s          
  |++++++++++++++++++++++++++++++                    | 60% ~14s          
  |+++++++++++++++++++++++++++++++                   | 61% ~13s          
  |+++++++++++++++++++++++++++++++                   | 62% ~13s          
  |++++++++++++++++++++++++++++++++                  | 63% ~13s          
  |++++++++++++++++++++++++++++++++                  | 64% ~12s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~12s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~12s          
  |++++++++++++++++++++++++++++++++++                | 67% ~11s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~11s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~10s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~10s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~10s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~09s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~09s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~09s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~08s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~08s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~08s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=34s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~31s          
  |++                                                | 2 % ~29s          
  |++                                                | 3 % ~30s          
  |+++                                               | 4 % ~29s          
  |+++                                               | 5 % ~29s          
  |++++                                              | 7 % ~28s          
  |++++                                              | 8 % ~30s          
  |+++++                                             | 9 % ~29s          
  |+++++                                             | 10% ~29s          
  |++++++                                            | 11% ~28s          
  |+++++++                                           | 12% ~27s          
  |+++++++                                           | 13% ~27s          
  |++++++++                                          | 14% ~26s          
  |++++++++                                          | 15% ~26s          
  |+++++++++                                         | 16% ~26s          
  |+++++++++                                         | 18% ~25s          
  |++++++++++                                        | 19% ~25s          
  |++++++++++                                        | 20% ~24s          
  |+++++++++++                                       | 21% ~24s          
  |+++++++++++                                       | 22% ~24s          
  |++++++++++++                                      | 23% ~23s          
  |+++++++++++++                                     | 24% ~23s          
  |+++++++++++++                                     | 25% ~22s          
  |++++++++++++++                                    | 26% ~22s          
  |++++++++++++++                                    | 27% ~22s          
  |+++++++++++++++                                   | 29% ~21s          
  |+++++++++++++++                                   | 30% ~21s          
  |++++++++++++++++                                  | 31% ~21s          
  |++++++++++++++++                                  | 32% ~20s          
  |+++++++++++++++++                                 | 33% ~20s          
  |++++++++++++++++++                                | 34% ~20s          
  |++++++++++++++++++                                | 35% ~19s          
  |+++++++++++++++++++                               | 36% ~19s          
  |+++++++++++++++++++                               | 37% ~19s          
  |++++++++++++++++++++                              | 38% ~18s          
  |++++++++++++++++++++                              | 40% ~18s          
  |+++++++++++++++++++++                             | 41% ~18s          
  |+++++++++++++++++++++                             | 42% ~17s          
  |++++++++++++++++++++++                            | 43% ~17s          
  |++++++++++++++++++++++                            | 44% ~17s          
  |+++++++++++++++++++++++                           | 45% ~17s          
  |++++++++++++++++++++++++                          | 46% ~16s          
  |++++++++++++++++++++++++                          | 47% ~16s          
  |+++++++++++++++++++++++++                         | 48% ~16s          
  |+++++++++++++++++++++++++                         | 49% ~15s          
  |++++++++++++++++++++++++++                        | 51% ~15s          
  |++++++++++++++++++++++++++                        | 52% ~15s          
  |+++++++++++++++++++++++++++                       | 53% ~14s          
  |+++++++++++++++++++++++++++                       | 54% ~14s          
  |++++++++++++++++++++++++++++                      | 55% ~14s          
  |+++++++++++++++++++++++++++++                     | 56% ~13s          
  |+++++++++++++++++++++++++++++                     | 57% ~13s          
  |++++++++++++++++++++++++++++++                    | 58% ~13s          
  |++++++++++++++++++++++++++++++                    | 59% ~12s          
  |+++++++++++++++++++++++++++++++                   | 60% ~12s          
  |+++++++++++++++++++++++++++++++                   | 62% ~12s          
  |++++++++++++++++++++++++++++++++                  | 63% ~11s          
  |++++++++++++++++++++++++++++++++                  | 64% ~11s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~11s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~10s          
  |++++++++++++++++++++++++++++++++++                | 67% ~10s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~10s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~09s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~09s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~09s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~08s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~08s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~08s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=31s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 10s      
  |++                                                | 2 % ~01m 10s      
  |++                                                | 3 % ~01m 08s      
  |+++                                               | 5 % ~01m 08s      
  |+++                                               | 6 % ~01m 07s      
  |++++                                              | 7 % ~01m 06s      
  |+++++                                             | 8 % ~01m 05s      
  |+++++                                             | 9 % ~01m 04s      
  |++++++                                            | 10% ~01m 03s      
  |++++++                                            | 11% ~01m 02s      
  |+++++++                                           | 13% ~01m 02s      
  |+++++++                                           | 14% ~01m 01s      
  |++++++++                                          | 15% ~01m 01s      
  |+++++++++                                         | 16% ~01m 00s      
  |+++++++++                                         | 17% ~60s          
  |++++++++++                                        | 18% ~59s          
  |++++++++++                                        | 20% ~58s          
  |+++++++++++                                       | 21% ~57s          
  |+++++++++++                                       | 22% ~56s          
  |++++++++++++                                      | 23% ~56s          
  |+++++++++++++                                     | 24% ~55s          
  |+++++++++++++                                     | 25% ~54s          
  |++++++++++++++                                    | 26% ~54s          
  |++++++++++++++                                    | 28% ~53s          
  |+++++++++++++++                                   | 29% ~52s          
  |+++++++++++++++                                   | 30% ~51s          
  |++++++++++++++++                                  | 31% ~50s          
  |+++++++++++++++++                                 | 32% ~49s          
  |+++++++++++++++++                                 | 33% ~49s          
  |++++++++++++++++++                                | 34% ~48s          
  |++++++++++++++++++                                | 36% ~47s          
  |+++++++++++++++++++                               | 37% ~46s          
  |+++++++++++++++++++                               | 38% ~45s          
  |++++++++++++++++++++                              | 39% ~45s          
  |+++++++++++++++++++++                             | 40% ~44s          
  |+++++++++++++++++++++                             | 41% ~43s          
  |++++++++++++++++++++++                            | 43% ~43s          
  |++++++++++++++++++++++                            | 44% ~42s          
  |+++++++++++++++++++++++                           | 45% ~41s          
  |+++++++++++++++++++++++                           | 46% ~40s          
  |++++++++++++++++++++++++                          | 47% ~39s          
  |+++++++++++++++++++++++++                         | 48% ~38s          
  |+++++++++++++++++++++++++                         | 49% ~37s          
  |++++++++++++++++++++++++++                        | 51% ~36s          
  |++++++++++++++++++++++++++                        | 52% ~35s          
  |+++++++++++++++++++++++++++                       | 53% ~35s          
  |++++++++++++++++++++++++++++                      | 54% ~34s          
  |++++++++++++++++++++++++++++                      | 55% ~33s          
  |+++++++++++++++++++++++++++++                     | 56% ~32s          
  |+++++++++++++++++++++++++++++                     | 57% ~31s          
  |++++++++++++++++++++++++++++++                    | 59% ~30s          
  |++++++++++++++++++++++++++++++                    | 60% ~29s          
  |+++++++++++++++++++++++++++++++                   | 61% ~29s          
  |++++++++++++++++++++++++++++++++                  | 62% ~28s          
  |++++++++++++++++++++++++++++++++                  | 63% ~27s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~26s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~25s          
  |++++++++++++++++++++++++++++++++++                | 67% ~25s          
  |++++++++++++++++++++++++++++++++++                | 68% ~24s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~23s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~22s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~21s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~20s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~19s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~19s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~18s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~17s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~16s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 14s
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 09s      
  |++                                                | 2 % ~01m 07s      
  |++                                                | 3 % ~01m 07s      
  |+++                                               | 4 % ~01m 05s      
  |+++                                               | 5 % ~01m 05s      
  |++++                                              | 6 % ~01m 03s      
  |++++                                              | 7 % ~01m 02s      
  |+++++                                             | 8 % ~01m 01s      
  |+++++                                             | 9 % ~01m 00s      
  |++++++                                            | 10% ~01m 06s      
  |++++++                                            | 11% ~01m 05s      
  |+++++++                                           | 12% ~01m 03s      
  |+++++++                                           | 14% ~01m 02s      
  |++++++++                                          | 15% ~01m 01s      
  |++++++++                                          | 16% ~60s          
  |+++++++++                                         | 17% ~59s          
  |+++++++++                                         | 18% ~58s          
  |++++++++++                                        | 19% ~57s          
  |++++++++++                                        | 20% ~56s          
  |+++++++++++                                       | 21% ~55s          
  |+++++++++++                                       | 22% ~55s          
  |++++++++++++                                      | 23% ~54s          
  |++++++++++++                                      | 24% ~53s          
  |+++++++++++++                                     | 25% ~52s          
  |++++++++++++++                                    | 26% ~51s          
  |++++++++++++++                                    | 27% ~51s          
  |+++++++++++++++                                   | 28% ~50s          
  |+++++++++++++++                                   | 29% ~49s          
  |++++++++++++++++                                  | 30% ~48s          
  |++++++++++++++++                                  | 31% ~48s          
  |+++++++++++++++++                                 | 32% ~47s          
  |+++++++++++++++++                                 | 33% ~46s          
  |++++++++++++++++++                                | 34% ~46s          
  |++++++++++++++++++                                | 35% ~45s          
  |+++++++++++++++++++                               | 36% ~44s          
  |+++++++++++++++++++                               | 38% ~43s          
  |++++++++++++++++++++                              | 39% ~43s          
  |++++++++++++++++++++                              | 40% ~42s          
  |+++++++++++++++++++++                             | 41% ~41s          
  |+++++++++++++++++++++                             | 42% ~41s          
  |++++++++++++++++++++++                            | 43% ~40s          
  |++++++++++++++++++++++                            | 44% ~39s          
  |+++++++++++++++++++++++                           | 45% ~38s          
  |+++++++++++++++++++++++                           | 46% ~38s          
  |++++++++++++++++++++++++                          | 47% ~37s          
  |++++++++++++++++++++++++                          | 48% ~36s          
  |+++++++++++++++++++++++++                         | 49% ~35s          
  |+++++++++++++++++++++++++                         | 50% ~35s          
  |++++++++++++++++++++++++++                        | 51% ~34s          
  |+++++++++++++++++++++++++++                       | 52% ~33s          
  |+++++++++++++++++++++++++++                       | 53% ~33s          
  |++++++++++++++++++++++++++++                      | 54% ~32s          
  |++++++++++++++++++++++++++++                      | 55% ~31s          
  |+++++++++++++++++++++++++++++                     | 56% ~31s          
  |+++++++++++++++++++++++++++++                     | 57% ~30s          
  |++++++++++++++++++++++++++++++                    | 58% ~29s          
  |++++++++++++++++++++++++++++++                    | 59% ~28s          
  |+++++++++++++++++++++++++++++++                   | 60% ~28s          
  |+++++++++++++++++++++++++++++++                   | 61% ~27s          
  |++++++++++++++++++++++++++++++++                  | 62% ~26s          
  |++++++++++++++++++++++++++++++++                  | 64% ~25s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~25s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~24s          
  |++++++++++++++++++++++++++++++++++                | 67% ~23s          
  |++++++++++++++++++++++++++++++++++                | 68% ~22s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~22s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~21s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~20s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~19s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~19s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~18s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~17s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~16s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~16s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~15s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~12s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 09s
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 45s      
  |++                                                | 2 % ~01m 43s      
  |++                                                | 3 % ~01m 41s      
  |+++                                               | 4 % ~01m 40s      
  |+++                                               | 5 % ~01m 37s      
  |++++                                              | 6 % ~01m 34s      
  |++++                                              | 7 % ~01m 33s      
  |+++++                                             | 8 % ~01m 32s      
  |+++++                                             | 9 % ~01m 31s      
  |++++++                                            | 10% ~01m 30s      
  |++++++                                            | 11% ~01m 30s      
  |+++++++                                           | 12% ~01m 29s      
  |+++++++                                           | 13% ~01m 28s      
  |++++++++                                          | 14% ~01m 27s      
  |++++++++                                          | 15% ~01m 27s      
  |+++++++++                                         | 16% ~01m 26s      
  |+++++++++                                         | 17% ~01m 25s      
  |++++++++++                                        | 18% ~01m 24s      
  |++++++++++                                        | 19% ~01m 23s      
  |+++++++++++                                       | 20% ~01m 22s      
  |+++++++++++                                       | 21% ~01m 21s      
  |++++++++++++                                      | 22% ~01m 20s      
  |++++++++++++                                      | 23% ~01m 20s      
  |+++++++++++++                                     | 24% ~01m 18s      
  |+++++++++++++                                     | 26% ~01m 17s      
  |++++++++++++++                                    | 27% ~01m 16s      
  |++++++++++++++                                    | 28% ~01m 15s      
  |+++++++++++++++                                   | 29% ~01m 14s      
  |+++++++++++++++                                   | 30% ~01m 14s      
  |++++++++++++++++                                  | 31% ~01m 13s      
  |++++++++++++++++                                  | 32% ~01m 12s      
  |+++++++++++++++++                                 | 33% ~01m 10s      
  |+++++++++++++++++                                 | 34% ~01m 09s      
  |++++++++++++++++++                                | 35% ~01m 08s      
  |++++++++++++++++++                                | 36% ~01m 07s      
  |+++++++++++++++++++                               | 37% ~01m 06s      
  |+++++++++++++++++++                               | 38% ~01m 05s      
  |++++++++++++++++++++                              | 39% ~01m 03s      
  |++++++++++++++++++++                              | 40% ~01m 02s      
  |+++++++++++++++++++++                             | 41% ~01m 01s      
  |+++++++++++++++++++++                             | 42% ~01m 00s      
  |++++++++++++++++++++++                            | 43% ~59s          
  |++++++++++++++++++++++                            | 44% ~58s          
  |+++++++++++++++++++++++                           | 45% ~57s          
  |+++++++++++++++++++++++                           | 46% ~56s          
  |++++++++++++++++++++++++                          | 47% ~55s          
  |++++++++++++++++++++++++                          | 48% ~54s          
  |+++++++++++++++++++++++++                         | 49% ~53s          
  |+++++++++++++++++++++++++                         | 50% ~52s          
  |++++++++++++++++++++++++++                        | 51% ~51s          
  |+++++++++++++++++++++++++++                       | 52% ~50s          
  |+++++++++++++++++++++++++++                       | 53% ~49s          
  |++++++++++++++++++++++++++++                      | 54% ~48s          
  |++++++++++++++++++++++++++++                      | 55% ~47s          
  |+++++++++++++++++++++++++++++                     | 56% ~46s          
  |+++++++++++++++++++++++++++++                     | 57% ~45s          
  |++++++++++++++++++++++++++++++                    | 58% ~44s          
  |++++++++++++++++++++++++++++++                    | 59% ~43s          
  |+++++++++++++++++++++++++++++++                   | 60% ~42s          
  |+++++++++++++++++++++++++++++++                   | 61% ~41s          
  |++++++++++++++++++++++++++++++++                  | 62% ~40s          
  |++++++++++++++++++++++++++++++++                  | 63% ~39s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~38s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~37s          
  |++++++++++++++++++++++++++++++++++                | 66% ~35s          
  |++++++++++++++++++++++++++++++++++                | 67% ~34s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~33s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~32s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~31s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~30s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~29s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~28s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~27s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~26s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~25s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~24s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~22s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~21s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~20s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~19s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~18s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~17s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~16s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~15s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 45s
Calculating cluster 5

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~30s          
  |++                                                | 3 % ~30s          
  |++                                                | 4 % ~29s          
  |+++                                               | 5 % ~29s          
  |++++                                              | 7 % ~28s          
  |++++                                              | 8 % ~28s          
  |+++++                                             | 9 % ~28s          
  |++++++                                            | 11% ~27s          
  |++++++                                            | 12% ~27s          
  |+++++++                                           | 13% ~27s          
  |++++++++                                          | 14% ~26s          
  |++++++++                                          | 16% ~26s          
  |+++++++++                                         | 17% ~25s          
  |++++++++++                                        | 18% ~25s          
  |++++++++++                                        | 20% ~25s          
  |+++++++++++                                       | 21% ~24s          
  |++++++++++++                                      | 22% ~24s          
  |++++++++++++                                      | 24% ~24s          
  |+++++++++++++                                     | 25% ~23s          
  |++++++++++++++                                    | 26% ~23s          
  |++++++++++++++                                    | 28% ~23s          
  |+++++++++++++++                                   | 29% ~22s          
  |++++++++++++++++                                  | 30% ~22s          
  |++++++++++++++++                                  | 32% ~21s          
  |+++++++++++++++++                                 | 33% ~21s          
  |++++++++++++++++++                                | 34% ~21s          
  |++++++++++++++++++                                | 36% ~20s          
  |+++++++++++++++++++                               | 37% ~20s          
  |++++++++++++++++++++                              | 38% ~20s          
  |++++++++++++++++++++                              | 39% ~19s          
  |+++++++++++++++++++++                             | 41% ~19s          
  |++++++++++++++++++++++                            | 42% ~19s          
  |++++++++++++++++++++++                            | 43% ~18s          
  |+++++++++++++++++++++++                           | 45% ~18s          
  |++++++++++++++++++++++++                          | 46% ~17s          
  |++++++++++++++++++++++++                          | 47% ~17s          
  |+++++++++++++++++++++++++                         | 49% ~17s          
  |+++++++++++++++++++++++++                         | 50% ~16s          
  |++++++++++++++++++++++++++                        | 51% ~16s          
  |+++++++++++++++++++++++++++                       | 53% ~16s          
  |+++++++++++++++++++++++++++                       | 54% ~16s          
  |++++++++++++++++++++++++++++                      | 55% ~15s          
  |+++++++++++++++++++++++++++++                     | 57% ~15s          
  |+++++++++++++++++++++++++++++                     | 58% ~14s          
  |++++++++++++++++++++++++++++++                    | 59% ~14s          
  |+++++++++++++++++++++++++++++++                   | 61% ~13s          
  |+++++++++++++++++++++++++++++++                   | 62% ~13s          
  |++++++++++++++++++++++++++++++++                  | 63% ~13s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~12s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~12s          
  |++++++++++++++++++++++++++++++++++                | 67% ~11s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~11s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~10s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~10s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~09s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~09s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~08s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~08s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~08s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=34s  
Calculating cluster 6

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 04s      
  |++                                                | 2 % ~01m 02s      
  |++                                                | 4 % ~01m 01s      
  |+++                                               | 5 % ~01m 01s      
  |+++                                               | 6 % ~60s          
  |++++                                              | 7 % ~59s          
  |+++++                                             | 8 % ~58s          
  |+++++                                             | 10% ~01m 00s      
  |++++++                                            | 11% ~59s          
  |++++++                                            | 12% ~58s          
  |+++++++                                           | 13% ~57s          
  |++++++++                                          | 14% ~56s          
  |++++++++                                          | 15% ~55s          
  |+++++++++                                         | 17% ~54s          
  |+++++++++                                         | 18% ~53s          
  |++++++++++                                        | 19% ~52s          
  |+++++++++++                                       | 20% ~52s          
  |+++++++++++                                       | 21% ~51s          
  |++++++++++++                                      | 23% ~50s          
  |++++++++++++                                      | 24% ~50s          
  |+++++++++++++                                     | 25% ~49s          
  |++++++++++++++                                    | 26% ~48s          
  |++++++++++++++                                    | 27% ~47s          
  |+++++++++++++++                                   | 29% ~47s          
  |+++++++++++++++                                   | 30% ~46s          
  |++++++++++++++++                                  | 31% ~45s          
  |+++++++++++++++++                                 | 32% ~44s          
  |+++++++++++++++++                                 | 33% ~44s          
  |++++++++++++++++++                                | 35% ~43s          
  |++++++++++++++++++                                | 36% ~42s          
  |+++++++++++++++++++                               | 37% ~41s          
  |++++++++++++++++++++                              | 38% ~41s          
  |++++++++++++++++++++                              | 39% ~40s          
  |+++++++++++++++++++++                             | 40% ~39s          
  |+++++++++++++++++++++                             | 42% ~38s          
  |++++++++++++++++++++++                            | 43% ~38s          
  |+++++++++++++++++++++++                           | 44% ~37s          
  |+++++++++++++++++++++++                           | 45% ~36s          
  |++++++++++++++++++++++++                          | 46% ~35s          
  |++++++++++++++++++++++++                          | 48% ~35s          
  |+++++++++++++++++++++++++                         | 49% ~34s          
  |+++++++++++++++++++++++++                         | 50% ~33s          
  |++++++++++++++++++++++++++                        | 51% ~33s          
  |+++++++++++++++++++++++++++                       | 52% ~32s          
  |+++++++++++++++++++++++++++                       | 54% ~31s          
  |++++++++++++++++++++++++++++                      | 55% ~30s          
  |++++++++++++++++++++++++++++                      | 56% ~29s          
  |+++++++++++++++++++++++++++++                     | 57% ~29s          
  |++++++++++++++++++++++++++++++                    | 58% ~28s          
  |++++++++++++++++++++++++++++++                    | 60% ~27s          
  |+++++++++++++++++++++++++++++++                   | 61% ~26s          
  |+++++++++++++++++++++++++++++++                   | 62% ~25s          
  |++++++++++++++++++++++++++++++++                  | 63% ~24s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~24s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~23s          
  |++++++++++++++++++++++++++++++++++                | 67% ~22s          
  |++++++++++++++++++++++++++++++++++                | 68% ~21s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~20s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~20s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~19s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~18s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~17s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~17s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~16s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~15s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~14s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~12s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 08s
Calculating cluster 7

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~14s          
  |++                                                | 3 % ~14s          
  |++                                                | 4 % ~14s          
  |+++                                               | 5 % ~14s          
  |++++                                              | 7 % ~13s          
  |++++                                              | 8 % ~13s          
  |+++++                                             | 9 % ~13s          
  |++++++                                            | 11% ~12s          
  |++++++                                            | 12% ~12s          
  |+++++++                                           | 13% ~12s          
  |++++++++                                          | 15% ~12s          
  |++++++++                                          | 16% ~12s          
  |+++++++++                                         | 17% ~12s          
  |++++++++++                                        | 19% ~11s          
  |++++++++++                                        | 20% ~11s          
  |+++++++++++                                       | 21% ~11s          
  |++++++++++++                                      | 23% ~11s          
  |++++++++++++                                      | 24% ~11s          
  |+++++++++++++                                     | 25% ~10s          
  |++++++++++++++                                    | 27% ~10s          
  |++++++++++++++                                    | 28% ~10s          
  |+++++++++++++++                                   | 29% ~10s          
  |++++++++++++++++                                  | 31% ~10s          
  |++++++++++++++++                                  | 32% ~09s          
  |+++++++++++++++++                                 | 33% ~09s          
  |++++++++++++++++++                                | 35% ~09s          
  |++++++++++++++++++                                | 36% ~09s          
  |+++++++++++++++++++                               | 37% ~09s          
  |++++++++++++++++++++                              | 39% ~09s          
  |++++++++++++++++++++                              | 40% ~08s          
  |+++++++++++++++++++++                             | 41% ~08s          
  |++++++++++++++++++++++                            | 43% ~08s          
  |++++++++++++++++++++++                            | 44% ~08s          
  |+++++++++++++++++++++++                           | 45% ~08s          
  |++++++++++++++++++++++++                          | 47% ~07s          
  |++++++++++++++++++++++++                          | 48% ~07s          
  |+++++++++++++++++++++++++                         | 49% ~07s          
  |++++++++++++++++++++++++++                        | 51% ~07s          
  |++++++++++++++++++++++++++                        | 52% ~07s          
  |+++++++++++++++++++++++++++                       | 53% ~07s          
  |++++++++++++++++++++++++++++                      | 55% ~06s          
  |++++++++++++++++++++++++++++                      | 56% ~06s          
  |+++++++++++++++++++++++++++++                     | 57% ~06s          
  |++++++++++++++++++++++++++++++                    | 59% ~06s          
  |++++++++++++++++++++++++++++++                    | 60% ~06s          
  |+++++++++++++++++++++++++++++++                   | 61% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |++++++++++++++++++++++++++++++++                  | 64% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~05s          
  |++++++++++++++++++++++++++++++++++                | 67% ~05s          
  |++++++++++++++++++++++++++++++++++                | 68% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=15s  
Calculating cluster 8

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 38s      
  |++                                                | 2 % ~01m 39s      
  |++                                                | 3 % ~01m 37s      
  |+++                                               | 4 % ~01m 42s      
  |+++                                               | 5 % ~01m 38s      
  |++++                                              | 6 % ~01m 36s      
  |++++                                              | 7 % ~01m 35s      
  |+++++                                             | 8 % ~01m 34s      
  |+++++                                             | 9 % ~01m 32s      
  |++++++                                            | 10% ~01m 31s      
  |++++++                                            | 11% ~01m 31s      
  |+++++++                                           | 12% ~01m 30s      
  |+++++++                                           | 14% ~01m 29s      
  |++++++++                                          | 15% ~01m 29s      
  |++++++++                                          | 16% ~01m 27s      
  |+++++++++                                         | 17% ~01m 26s      
  |+++++++++                                         | 18% ~01m 25s      
  |++++++++++                                        | 19% ~01m 24s      
  |++++++++++                                        | 20% ~01m 23s      
  |+++++++++++                                       | 21% ~01m 22s      
  |+++++++++++                                       | 22% ~01m 21s      
  |++++++++++++                                      | 23% ~01m 20s      
  |++++++++++++                                      | 24% ~01m 19s      
  |+++++++++++++                                     | 25% ~01m 18s      
  |++++++++++++++                                    | 26% ~01m 17s      
  |++++++++++++++                                    | 27% ~01m 17s      
  |+++++++++++++++                                   | 28% ~01m 15s      
  |+++++++++++++++                                   | 29% ~01m 14s      
  |++++++++++++++++                                  | 30% ~01m 13s      
  |++++++++++++++++                                  | 31% ~01m 11s      
  |+++++++++++++++++                                 | 32% ~01m 10s      
  |+++++++++++++++++                                 | 33% ~01m 09s      
  |++++++++++++++++++                                | 34% ~01m 07s      
  |++++++++++++++++++                                | 35% ~01m 06s      
  |+++++++++++++++++++                               | 36% ~01m 05s      
  |+++++++++++++++++++                               | 38% ~01m 04s      
  |++++++++++++++++++++                              | 39% ~01m 03s      
  |++++++++++++++++++++                              | 40% ~01m 02s      
  |+++++++++++++++++++++                             | 41% ~01m 01s      
  |+++++++++++++++++++++                             | 42% ~01m 00s      
  |++++++++++++++++++++++                            | 43% ~59s          
  |++++++++++++++++++++++                            | 44% ~58s          
  |+++++++++++++++++++++++                           | 45% ~57s          
  |+++++++++++++++++++++++                           | 46% ~56s          
  |++++++++++++++++++++++++                          | 47% ~55s          
  |++++++++++++++++++++++++                          | 48% ~54s          
  |+++++++++++++++++++++++++                         | 49% ~53s          
  |+++++++++++++++++++++++++                         | 50% ~52s          
  |++++++++++++++++++++++++++                        | 51% ~51s          
  |+++++++++++++++++++++++++++                       | 52% ~50s          
  |+++++++++++++++++++++++++++                       | 53% ~49s          
  |++++++++++++++++++++++++++++                      | 54% ~47s          
  |++++++++++++++++++++++++++++                      | 55% ~46s          
  |+++++++++++++++++++++++++++++                     | 56% ~45s          
  |+++++++++++++++++++++++++++++                     | 57% ~44s          
  |++++++++++++++++++++++++++++++                    | 58% ~43s          
  |++++++++++++++++++++++++++++++                    | 59% ~42s          
  |+++++++++++++++++++++++++++++++                   | 60% ~41s          
  |+++++++++++++++++++++++++++++++                   | 61% ~40s          
  |++++++++++++++++++++++++++++++++                  | 62% ~39s          
  |++++++++++++++++++++++++++++++++                  | 64% ~38s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~37s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~35s          
  |++++++++++++++++++++++++++++++++++                | 67% ~34s          
  |++++++++++++++++++++++++++++++++++                | 68% ~33s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~32s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~31s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~30s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~29s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~28s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~27s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~26s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~25s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~24s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~23s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~22s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~20s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~19s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~18s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~17s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~16s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~15s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 44s
Calculating cluster 9

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02m 18s      
  |++                                                | 2 % ~02m 18s      
  |++                                                | 3 % ~02m 14s      
  |+++                                               | 4 % ~02m 12s      
  |+++                                               | 5 % ~02m 11s      
  |++++                                              | 6 % ~02m 10s      
  |++++                                              | 7 % ~02m 09s      
  |+++++                                             | 9 % ~02m 09s      
  |+++++                                             | 10% ~02m 08s      
  |++++++                                            | 11% ~02m 07s      
  |++++++                                            | 12% ~02m 06s      
  |+++++++                                           | 13% ~02m 05s      
  |+++++++                                           | 14% ~02m 03s      
  |++++++++                                          | 15% ~02m 03s      
  |++++++++                                          | 16% ~02m 01s      
  |+++++++++                                         | 17% ~01m 59s      
  |++++++++++                                        | 18% ~01m 58s      
  |++++++++++                                        | 19% ~01m 56s      
  |+++++++++++                                       | 20% ~01m 54s      
  |+++++++++++                                       | 21% ~01m 52s      
  |++++++++++++                                      | 22% ~01m 51s      
  |++++++++++++                                      | 23% ~01m 49s      
  |+++++++++++++                                     | 24% ~01m 48s      
  |+++++++++++++                                     | 26% ~01m 46s      
  |++++++++++++++                                    | 27% ~01m 45s      
  |++++++++++++++                                    | 28% ~01m 43s      
  |+++++++++++++++                                   | 29% ~01m 42s      
  |+++++++++++++++                                   | 30% ~01m 40s      
  |++++++++++++++++                                  | 31% ~01m 39s      
  |++++++++++++++++                                  | 32% ~01m 38s      
  |+++++++++++++++++                                 | 33% ~01m 36s      
  |++++++++++++++++++                                | 34% ~01m 34s      
  |++++++++++++++++++                                | 35% ~01m 33s      
  |+++++++++++++++++++                               | 36% ~01m 31s      
  |+++++++++++++++++++                               | 37% ~01m 29s      
  |++++++++++++++++++++                              | 38% ~01m 28s      
  |++++++++++++++++++++                              | 39% ~01m 26s      
  |+++++++++++++++++++++                             | 40% ~01m 25s      
  |+++++++++++++++++++++                             | 41% ~01m 23s      
  |++++++++++++++++++++++                            | 43% ~01m 22s      
  |++++++++++++++++++++++                            | 44% ~01m 21s      
  |+++++++++++++++++++++++                           | 45% ~01m 19s      
  |+++++++++++++++++++++++                           | 46% ~01m 18s      
  |++++++++++++++++++++++++                          | 47% ~01m 17s      
  |++++++++++++++++++++++++                          | 48% ~01m 15s      
  |+++++++++++++++++++++++++                         | 49% ~01m 13s      
  |+++++++++++++++++++++++++                         | 50% ~01m 12s      
  |++++++++++++++++++++++++++                        | 51% ~01m 10s      
  |+++++++++++++++++++++++++++                       | 52% ~01m 08s      
  |+++++++++++++++++++++++++++                       | 53% ~01m 07s      
  |++++++++++++++++++++++++++++                      | 54% ~01m 05s      
  |++++++++++++++++++++++++++++                      | 55% ~01m 04s      
  |+++++++++++++++++++++++++++++                     | 56% ~01m 02s      
  |+++++++++++++++++++++++++++++                     | 57% ~01m 01s      
  |++++++++++++++++++++++++++++++                    | 59% ~59s          
  |++++++++++++++++++++++++++++++                    | 60% ~58s          
  |+++++++++++++++++++++++++++++++                   | 61% ~56s          
  |+++++++++++++++++++++++++++++++                   | 62% ~55s          
  |++++++++++++++++++++++++++++++++                  | 63% ~53s          
  |++++++++++++++++++++++++++++++++                  | 64% ~52s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~50s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~49s          
  |++++++++++++++++++++++++++++++++++                | 67% ~47s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~46s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~44s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~43s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~41s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~39s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~38s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~36s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~35s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~33s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~32s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~30s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~29s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~27s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~26s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~24s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~23s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~21s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~20s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~18s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~17s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~15s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02m 22s
Calculating cluster 10

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~45s          
  |++                                                | 2 % ~46s          
  |++                                                | 3 % ~45s          
  |+++                                               | 4 % ~45s          
  |+++                                               | 5 % ~44s          
  |++++                                              | 7 % ~43s          
  |++++                                              | 8 % ~43s          
  |+++++                                             | 9 % ~42s          
  |+++++                                             | 10% ~41s          
  |++++++                                            | 11% ~41s          
  |++++++                                            | 12% ~40s          
  |+++++++                                           | 13% ~40s          
  |++++++++                                          | 14% ~40s          
  |++++++++                                          | 15% ~39s          
  |+++++++++                                         | 16% ~39s          
  |+++++++++                                         | 17% ~39s          
  |++++++++++                                        | 18% ~38s          
  |++++++++++                                        | 20% ~38s          
  |+++++++++++                                       | 21% ~38s          
  |+++++++++++                                       | 22% ~37s          
  |++++++++++++                                      | 23% ~37s          
  |++++++++++++                                      | 24% ~36s          
  |+++++++++++++                                     | 25% ~36s          
  |++++++++++++++                                    | 26% ~36s          
  |++++++++++++++                                    | 27% ~35s          
  |+++++++++++++++                                   | 28% ~35s          
  |+++++++++++++++                                   | 29% ~34s          
  |++++++++++++++++                                  | 30% ~34s          
  |++++++++++++++++                                  | 32% ~33s          
  |+++++++++++++++++                                 | 33% ~33s          
  |+++++++++++++++++                                 | 34% ~32s          
  |++++++++++++++++++                                | 35% ~32s          
  |++++++++++++++++++                                | 36% ~31s          
  |+++++++++++++++++++                               | 37% ~31s          
  |++++++++++++++++++++                              | 38% ~31s          
  |++++++++++++++++++++                              | 39% ~30s          
  |+++++++++++++++++++++                             | 40% ~30s          
  |+++++++++++++++++++++                             | 41% ~29s          
  |++++++++++++++++++++++                            | 42% ~28s          
  |++++++++++++++++++++++                            | 43% ~28s          
  |+++++++++++++++++++++++                           | 45% ~27s          
  |+++++++++++++++++++++++                           | 46% ~27s          
  |++++++++++++++++++++++++                          | 47% ~26s          
  |++++++++++++++++++++++++                          | 48% ~26s          
  |+++++++++++++++++++++++++                         | 49% ~25s          
  |+++++++++++++++++++++++++                         | 50% ~24s          
  |++++++++++++++++++++++++++                        | 51% ~24s          
  |+++++++++++++++++++++++++++                       | 52% ~23s          
  |+++++++++++++++++++++++++++                       | 53% ~23s          
  |++++++++++++++++++++++++++++                      | 54% ~22s          
  |++++++++++++++++++++++++++++                      | 55% ~22s          
  |+++++++++++++++++++++++++++++                     | 57% ~21s          
  |+++++++++++++++++++++++++++++                     | 58% ~21s          
  |++++++++++++++++++++++++++++++                    | 59% ~20s          
  |++++++++++++++++++++++++++++++                    | 60% ~20s          
  |+++++++++++++++++++++++++++++++                   | 61% ~19s          
  |+++++++++++++++++++++++++++++++                   | 62% ~19s          
  |++++++++++++++++++++++++++++++++                  | 63% ~18s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~18s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~17s          
  |++++++++++++++++++++++++++++++++++                | 66% ~16s          
  |++++++++++++++++++++++++++++++++++                | 67% ~16s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~15s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~15s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~14s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~14s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~13s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~13s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~12s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~12s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~11s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~11s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=50s  
Calculating cluster 11

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02m 58s      
  |++                                                | 2 % ~02m 58s      
  |++                                                | 3 % ~03m 01s      
  |+++                                               | 4 % ~02m 55s      
  |+++                                               | 5 % ~02m 50s      
  |++++                                              | 6 % ~02m 48s      
  |++++                                              | 7 % ~02m 46s      
  |+++++                                             | 8 % ~02m 45s      
  |+++++                                             | 9 % ~02m 43s      
  |++++++                                            | 11% ~02m 42s      
  |++++++                                            | 12% ~02m 40s      
  |+++++++                                           | 13% ~02m 39s      
  |+++++++                                           | 14% ~02m 37s      
  |++++++++                                          | 15% ~02m 36s      
  |++++++++                                          | 16% ~02m 34s      
  |+++++++++                                         | 17% ~02m 34s      
  |+++++++++                                         | 18% ~02m 32s      
  |++++++++++                                        | 19% ~02m 29s      
  |++++++++++                                        | 20% ~02m 27s      
  |+++++++++++                                       | 21% ~02m 24s      
  |++++++++++++                                      | 22% ~02m 22s      
  |++++++++++++                                      | 23% ~02m 20s      
  |+++++++++++++                                     | 24% ~02m 18s      
  |+++++++++++++                                     | 25% ~02m 16s      
  |++++++++++++++                                    | 26% ~02m 14s      
  |++++++++++++++                                    | 27% ~02m 12s      
  |+++++++++++++++                                   | 28% ~02m 10s      
  |+++++++++++++++                                   | 29% ~02m 09s      
  |++++++++++++++++                                  | 31% ~02m 07s      
  |++++++++++++++++                                  | 32% ~02m 04s      
  |+++++++++++++++++                                 | 33% ~02m 02s      
  |+++++++++++++++++                                 | 34% ~02m 00s      
  |++++++++++++++++++                                | 35% ~01m 58s      
  |++++++++++++++++++                                | 36% ~01m 56s      
  |+++++++++++++++++++                               | 37% ~01m 54s      
  |+++++++++++++++++++                               | 38% ~01m 52s      
  |++++++++++++++++++++                              | 39% ~01m 50s      
  |++++++++++++++++++++                              | 40% ~01m 49s      
  |+++++++++++++++++++++                             | 41% ~01m 47s      
  |++++++++++++++++++++++                            | 42% ~01m 45s      
  |++++++++++++++++++++++                            | 43% ~01m 44s      
  |+++++++++++++++++++++++                           | 44% ~01m 41s      
  |+++++++++++++++++++++++                           | 45% ~01m 39s      
  |++++++++++++++++++++++++                          | 46% ~01m 37s      
  |++++++++++++++++++++++++                          | 47% ~01m 35s      
  |+++++++++++++++++++++++++                         | 48% ~01m 33s      
  |+++++++++++++++++++++++++                         | 49% ~01m 31s      
  |++++++++++++++++++++++++++                        | 51% ~01m 29s      
  |++++++++++++++++++++++++++                        | 52% ~01m 27s      
  |+++++++++++++++++++++++++++                       | 53% ~01m 26s      
  |+++++++++++++++++++++++++++                       | 54% ~01m 24s      
  |++++++++++++++++++++++++++++                      | 55% ~01m 22s      
  |++++++++++++++++++++++++++++                      | 56% ~01m 20s      
  |+++++++++++++++++++++++++++++                     | 57% ~01m 18s      
  |+++++++++++++++++++++++++++++                     | 58% ~01m 16s      
  |++++++++++++++++++++++++++++++                    | 59% ~01m 14s      
  |++++++++++++++++++++++++++++++                    | 60% ~01m 12s      
  |+++++++++++++++++++++++++++++++                   | 61% ~01m 10s      
  |++++++++++++++++++++++++++++++++                  | 62% ~01m 08s      
  |++++++++++++++++++++++++++++++++                  | 63% ~01m 07s      
  |+++++++++++++++++++++++++++++++++                 | 64% ~01m 05s      
  |+++++++++++++++++++++++++++++++++                 | 65% ~01m 03s      
  |++++++++++++++++++++++++++++++++++                | 66% ~01m 01s      
  |++++++++++++++++++++++++++++++++++                | 67% ~59s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~57s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~55s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~53s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~51s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~49s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~47s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~46s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~44s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~42s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~40s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~38s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~36s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~34s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~32s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~30s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~28s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~27s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~25s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~23s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~21s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~19s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~17s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03m 00s
save(all_data.markers, cis_markers, cocl2_markers, dabtram_markers, file = 'all_data_markers.RData')
#find lineages that are maintained at both dabtram timepoints
fivecell_cDNA$DabTramMaintained <- Reduce(intersect, list(fivecell_cDNA$DabTram, fivecell_cDNA$DabTramtoDabTram))

filtered_meta <- rep(0, length(names(all_data$Lineage)))

#specify which cells are in lineages that pass filtering for that condition
filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %in% combined_lins_list$DabTram)] <- 'Resistant to DabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %in% combined_lins_list$DabTramtoDabTram)] <- 'Resistant to DabTramtoDabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtococl2" & all_data$Lineage %in% combined_lins_list$DabTramtoCoCl2)] <- 'Resistant to DabTramtoCoCl2'
filtered_meta[which(all_data$OG_condition == "dabtramtocis" & all_data$Lineage %in% combined_lins_list$DabTramtoCis)] <- 'Resistant to DabTramtoCis'
filtered_meta[which(all_data$OG_condition == "cocl2" & all_data$Lineage %in% combined_lins_list$CoCl2)] <- 'Resistant to CoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2todabtram" & all_data$Lineage %in% combined_lins_list$CoCl2toDabTram)] <- 'Resistant to CoCl2toDabTram'
filtered_meta[which(all_data$OG_condition == "cocl2tococl2" & all_data$Lineage %in% combined_lins_list$CoCl2toCoCl2)] <- 'Resistant to CoCl2toCoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2tocis" & all_data$Lineage %in% combined_lins_list$CoCl2toCis)] <- 'Resistant to CoCl2toCis'
filtered_meta[which(all_data$OG_condition == "cis" & all_data$Lineage %in% combined_lins_list$Cis)] <- 'Resistant to Cis'
filtered_meta[which(all_data$OG_condition == "cistodabtram" & all_data$Lineage %in% combined_lins_list$CistoDabTram)] <- 'Resistant to CistoDabTram'
filtered_meta[which(all_data$OG_condition == "cistococl2" & all_data$Lineage %in% combined_lins_list$CistoCoCl2)] <- 'Resistant to CistoCoCl2'
filtered_meta[which(all_data$OG_condition == "cistocis" & all_data$Lineage %in% combined_lins_list$CistoCis)] <- 'Resistant to CistoCis'

#specify which cells are in lineages of more than 5 cells
filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %in% fivecell_cDNA$DabTram)] <- 'Large Resistant to DabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %in% fivecell_cDNA$DabTramtoDabTram)] <- 'Large Resistant to DabTramtoDabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtococl2" & all_data$Lineage %in% fivecell_cDNA$DabTramtoCoCl2)] <- 'Large Resistant to DabTramtoCoCl2'
filtered_meta[which(all_data$OG_condition == "dabtramtocis" & all_data$Lineage %in% fivecell_cDNA$DabTramtoCis)] <- 'Large Resistant to DabTramtoCis'
filtered_meta[which(all_data$OG_condition == "cocl2" & all_data$Lineage %in% fivecell_cDNA$CoCl2)] <- 'Large Resistant to CoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2todabtram" & all_data$Lineage %in% fivecell_cDNA$CoCl2toDabTram)] <- 'Large Resistant to CoCl2toDabTram'
filtered_meta[which(all_data$OG_condition == "cocl2tococl2" & all_data$Lineage %in% fivecell_cDNA$CoCl2toCoCl2)] <- 'Large Resistant to CoCl2toCoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2tocis" & all_data$Lineage %in% fivecell_cDNA$CoCl2toCis)] <- 'Large Resistant to CoCl2toCis'
filtered_meta[which(all_data$OG_condition == "cis" & all_data$Lineage %in% fivecell_cDNA$Cis)] <- 'Large Resistant to Cis'
filtered_meta[which(all_data$OG_condition == "cistodabtram" & all_data$Lineage %in% fivecell_cDNA$CistoDabTram)] <- 'Large Resistant to CistoDabTram'
filtered_meta[which(all_data$OG_condition == "cistococl2" & all_data$Lineage %in% fivecell_cDNA$CistoCoCl2)] <- 'Large Resistant to CistoCoCl2'
filtered_meta[which(all_data$OG_condition == "cistocis" & all_data$Lineage %in% fivecell_cDNA$CistoCis)] <- 'Large Resistant to CistoCis'

# filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %in% fivecell_cDNA$DabTramMaintained)] <- 'Maintained Resistant to DabTram'
# filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %in% fivecell_cDNA$DabTramMaintained)] <- 'Maintained Resistant to DabTramtoDabTram'

#specify which cells are in lineages that did not pass filtering
filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %nin% combined_lins_list$DabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %nin% combined_lins_list$DabTramtoDabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "dabtramtococl2" & all_data$Lineage %nin% combined_lins_list$DabTramtoCoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "dabtramtocis" & all_data$Lineage %nin% combined_lins_list$DabTramtoCis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2" & all_data$Lineage %nin% combined_lins_list$CoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2todabtram" & all_data$Lineage %nin% combined_lins_list$CoCl2toDabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2tococl2" & all_data$Lineage %nin% combined_lins_list$CoCl2toCoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2tocis" & all_data$Lineage %nin% combined_lins_list$CoCl2toCis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cis" & all_data$Lineage %nin% combined_lins_list$Cis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cistodabtram" & all_data$Lineage %nin% combined_lins_list$CistoDabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cistococl2" & all_data$Lineage %nin% combined_lins_list$CistoCoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cistocis" & all_data$Lineage %nin% combined_lins_list$CistoCis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 

#specify which cells had zero or multiple barcodes
filtered_meta[which(all_data$Lineage %in% c("No Barcode", "Still multiple"))] <- 'No Barcode'

print(table(filtered_meta))
filtered_meta
                       Filtered out              Large Resistant to Cis         Large Resistant to CistoCis       Large Resistant to CistoCoCl2 
                               3337                                1375                                 951                                2078 
    Large Resistant to CistoDabTram            Large Resistant to CoCl2       Large Resistant to CoCl2toCis     Large Resistant to CoCl2toCoCl2 
                               1394                                1784                                3010                               11578 
  Large Resistant to CoCl2toDabTram          Large Resistant to DabTram     Large Resistant to DabTramtoCis   Large Resistant to DabTramtoCoCl2 
                                663                                 478                                4234                                2840 
Large Resistant to DabTramtoDabTram                          No Barcode                    Resistant to Cis               Resistant to CistoCis 
                               3176                               35314                                 331                                  67 
            Resistant to CistoCoCl2           Resistant to CistoDabTram                  Resistant to CoCl2             Resistant to CoCl2toCis 
                                135                                 113                                 278                                 157 
          Resistant to CoCl2toCoCl2         Resistant to CoCl2toDabTram                Resistant to DabTram           Resistant to DabTramtoCis 
                                 55                                  93                                 337                                 225 
        Resistant to DabTramtoCoCl2       Resistant to DabTramtoDabTram 
                                100                                 222 
all_data$Resistant_filtered <- filtered_meta
Idents(all_data) <- all_data$Resistant_filtered
pdf('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/test_plot.pdf', height = 10, width = 20)
DimPlot(all_data, group.by = 'ident', cols = )
DimPlot(all_data, group.by = "Lineage") + theme(legend.position = 'none')
dev.off()
null device 
          1 

#Looking into the one lineage that switches ngfr -> egfr

pdf('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/test_violin.pdf', height = 10, width = 30)

VlnPlot(all_data, features = 'NGFR', idents = 'Maintained Resistant to DabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)
Warning in SingleExIPlot(type = type, data = data[, x, drop = FALSE], idents = idents,  :
  All cells have the same value of NGFR.
Warning in max(data[, feature][is.finite(x = data[, feature])]) :
  no non-missing arguments to max; returning -Inf
Warning in min(data[, feature]) :
  no non-missing arguments to min; returning Inf
VlnPlot(all_data, features = 'EGFR', idents = 'Maintained Resistant to DabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)
Warning in SingleExIPlot(type = type, data = data[, x, drop = FALSE], idents = idents,  :
  All cells have the same value of EGFR.
Warning in max(data[, feature][is.finite(x = data[, feature])]) :
  no non-missing arguments to max; returning -Inf
Warning in min(data[, feature]) :
  no non-missing arguments to min; returning Inf
VlnPlot(all_data, features = 'NGFR', idents = 'Maintained Resistant to DabTramtoDabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)
Warning in SingleExIPlot(type = type, data = data[, x, drop = FALSE], idents = idents,  :
  All cells have the same value of NGFR.
Warning in max(data[, feature][is.finite(x = data[, feature])]) :
  no non-missing arguments to max; returning -Inf
Warning in min(data[, feature]) :
  no non-missing arguments to min; returning Inf
VlnPlot(all_data, features = 'EGFR', idents = 'Maintained Resistant to DabTramtoDabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)
Warning in SingleExIPlot(type = type, data = data[, x, drop = FALSE], idents = idents,  :
  All cells have the same value of EGFR.
Warning in max(data[, feature][is.finite(x = data[, feature])]) :
  no non-missing arguments to max; returning -Inf
Warning in min(data[, feature]) :
  no non-missing arguments to min; returning Inf
VlnPlot(all_data, features = 'NGFR', idents = 'Large Resistant to DabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)
VlnPlot(all_data, features = 'EGFR', idents = 'Large Resistant to DabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)
VlnPlot(all_data, features = 'NGFR', idents = 'Large Resistant to DabTramtoDabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)
VlnPlot(all_data, features = 'EGFR', idents = 'Large Resistant to DabTramtoDabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)

dev.off()
null device 
          1 
#VlnPlot(all_data, features = 'NGFR', idents = all_data$OG_condition == 'dabtram', group.by = "lineage")

#from dabtram_both_times, force 2 clusters in umap, plot vs ngfr egfr, find markers of these 2


switch_lin_dabtram <- names(all_data$orig.ident[all_data$Lineage == "Lin171516" & all_data$OG_condition == 'dabtram'])
switch_lin_dabtramtodabtram <- names(all_data$orig.ident[all_data$Lineage == "Lin171516" & all_data$OG_condition == 'dabtramtodabtram'])

DimPlot(all_data, group.by = "OG_condition", cols = c('dabtram' = '#623594', 'cocl2' = '#0F8241', 'cis' = '#C96D29', 'dabtramtodabtram' = '#561E59', 'dabtramtococl2' = '#A2248E', 'dabtramtocis' = '#9D85BE', 'cocl2todabtram' = '#10413B', 'cocl2tococl2' = '#6ABD45', 'cocl2tocis' = '#6DC49C', 'cistodabtram' = '#A23622', 'cistococl2' = '#F49129', 'cistocis' = '#FBD08C'))

DimPlot(all_data, cells.highlight = list(switch_lin_dabtram), cols.highlight = c('red'))

DimPlot(all_data, cells.highlight = list(switch_lin_dabtram, switch_lin_dabtramtodabtram), cols.highlight = c('blue', 'red'))


switch_lin <- names(dabtram$orig.ident[dabtram$Lineage == "Lin171516"])
DimPlot(dabtram)

DimPlot(dabtram, cells.highlight = list(switch_lin))

#Assign cluster assignments per lineage, find average score per lineage - make plots in order


dabtram_both_times_markers <- FindAllMarkers(dabtram_both_times, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~19s          
  |++                                                | 2 % ~18s          
  |++                                                | 3 % ~18s          
  |+++                                               | 4 % ~18s          
  |+++                                               | 6 % ~17s          
  |++++                                              | 7 % ~17s          
  |++++                                              | 8 % ~17s          
  |+++++                                             | 9 % ~17s          
  |+++++                                             | 10% ~17s          
  |++++++                                            | 11% ~16s          
  |+++++++                                           | 12% ~22s          
  |+++++++                                           | 13% ~22s          
  |++++++++                                          | 14% ~21s          
  |++++++++                                          | 16% ~20s          
  |+++++++++                                         | 17% ~20s          
  |+++++++++                                         | 18% ~19s          
  |++++++++++                                        | 19% ~19s          
  |++++++++++                                        | 20% ~18s          
  |+++++++++++                                       | 21% ~18s          
  |++++++++++++                                      | 22% ~17s          
  |++++++++++++                                      | 23% ~17s          
  |+++++++++++++                                     | 24% ~16s          
  |+++++++++++++                                     | 26% ~16s          
  |++++++++++++++                                    | 27% ~16s          
  |++++++++++++++                                    | 28% ~15s          
  |+++++++++++++++                                   | 29% ~15s          
  |+++++++++++++++                                   | 30% ~15s          
  |++++++++++++++++                                  | 31% ~14s          
  |+++++++++++++++++                                 | 32% ~14s          
  |+++++++++++++++++                                 | 33% ~14s          
  |++++++++++++++++++                                | 34% ~14s          
  |++++++++++++++++++                                | 36% ~13s          
  |+++++++++++++++++++                               | 37% ~13s          
  |+++++++++++++++++++                               | 38% ~13s          
  |++++++++++++++++++++                              | 39% ~12s          
  |++++++++++++++++++++                              | 40% ~12s          
  |+++++++++++++++++++++                             | 41% ~12s          
  |++++++++++++++++++++++                            | 42% ~12s          
  |++++++++++++++++++++++                            | 43% ~11s          
  |+++++++++++++++++++++++                           | 44% ~11s          
  |+++++++++++++++++++++++                           | 46% ~11s          
  |++++++++++++++++++++++++                          | 47% ~11s          
  |++++++++++++++++++++++++                          | 48% ~10s          
  |+++++++++++++++++++++++++                         | 49% ~10s          
  |+++++++++++++++++++++++++                         | 50% ~10s          
  |++++++++++++++++++++++++++                        | 51% ~10s          
  |+++++++++++++++++++++++++++                       | 52% ~09s          
  |+++++++++++++++++++++++++++                       | 53% ~09s          
  |++++++++++++++++++++++++++++                      | 54% ~09s          
  |++++++++++++++++++++++++++++                      | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~09s          
  |+++++++++++++++++++++++++++++                     | 58% ~08s          
  |++++++++++++++++++++++++++++++                    | 59% ~08s          
  |++++++++++++++++++++++++++++++                    | 60% ~08s          
  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
  |++++++++++++++++++++++++++++++++                  | 62% ~07s          
  |++++++++++++++++++++++++++++++++                  | 63% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~06s          
  |++++++++++++++++++++++++++++++++++                | 68% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=19s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~20s          
  |+                                                 | 2 % ~21s          
  |++                                                | 3 % ~21s          
  |++                                                | 4 % ~20s          
  |+++                                               | 5 % ~20s          
  |+++                                               | 6 % ~20s          
  |++++                                              | 7 % ~20s          
  |++++                                              | 8 % ~19s          
  |+++++                                             | 9 % ~19s          
  |+++++                                             | 10% ~27s          
  |++++++                                            | 11% ~26s          
  |++++++                                            | 12% ~25s          
  |+++++++                                           | 13% ~24s          
  |+++++++                                           | 14% ~23s          
  |++++++++                                          | 15% ~23s          
  |++++++++                                          | 16% ~22s          
  |+++++++++                                         | 17% ~22s          
  |+++++++++                                         | 18% ~21s          
  |++++++++++                                        | 19% ~21s          
  |++++++++++                                        | 20% ~20s          
  |+++++++++++                                       | 21% ~20s          
  |+++++++++++                                       | 22% ~19s          
  |++++++++++++                                      | 23% ~19s          
  |++++++++++++                                      | 24% ~19s          
  |+++++++++++++                                     | 25% ~18s          
  |+++++++++++++                                     | 26% ~18s          
  |++++++++++++++                                    | 27% ~18s          
  |++++++++++++++                                    | 28% ~17s          
  |+++++++++++++++                                   | 29% ~17s          
  |+++++++++++++++                                   | 30% ~17s          
  |++++++++++++++++                                  | 31% ~16s          
  |++++++++++++++++                                  | 32% ~16s          
  |+++++++++++++++++                                 | 33% ~16s          
  |+++++++++++++++++                                 | 34% ~16s          
  |++++++++++++++++++                                | 35% ~15s          
  |++++++++++++++++++                                | 36% ~15s          
  |+++++++++++++++++++                               | 37% ~15s          
  |+++++++++++++++++++                               | 38% ~14s          
  |++++++++++++++++++++                              | 39% ~14s          
  |++++++++++++++++++++                              | 40% ~14s          
  |+++++++++++++++++++++                             | 41% ~14s          
  |+++++++++++++++++++++                             | 42% ~13s          
  |++++++++++++++++++++++                            | 43% ~13s          
  |++++++++++++++++++++++                            | 44% ~13s          
  |+++++++++++++++++++++++                           | 45% ~13s          
  |+++++++++++++++++++++++                           | 46% ~12s          
  |++++++++++++++++++++++++                          | 47% ~12s          
  |++++++++++++++++++++++++                          | 48% ~12s          
  |+++++++++++++++++++++++++                         | 49% ~12s          
  |+++++++++++++++++++++++++                         | 50% ~11s          
  |++++++++++++++++++++++++++                        | 51% ~11s          
  |++++++++++++++++++++++++++                        | 52% ~11s          
  |+++++++++++++++++++++++++++                       | 53% ~11s          
  |+++++++++++++++++++++++++++                       | 54% ~10s          
  |++++++++++++++++++++++++++++                      | 55% ~10s          
  |++++++++++++++++++++++++++++                      | 56% ~10s          
  |+++++++++++++++++++++++++++++                     | 57% ~10s          
  |+++++++++++++++++++++++++++++                     | 58% ~09s          
  |++++++++++++++++++++++++++++++                    | 59% ~09s          
  |++++++++++++++++++++++++++++++                    | 60% ~09s          
  |+++++++++++++++++++++++++++++++                   | 61% ~09s          
  |+++++++++++++++++++++++++++++++                   | 62% ~08s          
  |++++++++++++++++++++++++++++++++                  | 63% ~08s          
  |++++++++++++++++++++++++++++++++                  | 64% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~08s          
  |++++++++++++++++++++++++++++++++++                | 67% ~07s          
  |++++++++++++++++++++++++++++++++++                | 68% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~07s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=22s  
DimPlot(dabtram_both_times)

DimPlot(dabtram_both_times, group.by = 'OG_condition')

FeaturePlot(dabtram_both_times, features = c('NGFR', 'EGFR', 'nFeature_RNA'))

Plot the number of cells per lineage in second drug for lineages that survived in DabTram

#average cell assignments per lineage in dabtram_maintained

#want to do a stacked barplot here-- copy paste code from condition clustering

#get lineage and cluster data from seurat object, switch cluster identifiers from 0,1 to -1,1 (egfr, ngfr)
clusters_per_lin <- data.frame (Cluster = as.numeric(as.character(dabtram_both_times$seurat_clusters)), Lineage = dabtram_both_times$Lineage, condition = dabtram_both_times$OG_condition)
clusters_per_lin$Cluster[clusters_per_lin$Cluster == 0] <- -1
clusters_per_lin_list <- list()

# Need to get percent values of EGFR for the lineage after the first treatment
for (i in fivecell_cDNA$DabTram){
  currentlin <- filter(clusters_per_lin, clusters_per_lin$Lineage == i & clusters_per_lin$condition == 'dabtram')
  Var1 <- c(-1,1)
  Freq <- c(sum(filter(clusters_per_lin, clusters_per_lin$Lineage == i & clusters_per_lin$condition == 'dabtram')$Cluster == -1), # EGFR
  sum(filter(clusters_per_lin, clusters_per_lin$Lineage == i & clusters_per_lin$condition == 'dabtram')$Cluster == 1))
  clusters_per_lin_list[[i]] <- data.frame('Var1' = Var1, 'Freq' = Freq)
  clusters_per_lin_list[[i]]$Score <- weighted.mean(as.numeric(as.character(clusters_per_lin_list[[i]]$Var1)), clusters_per_lin_list[[i]]$Freq)
}

# Build a dataframe for plotting based on % EGFR or NGFR per lineage after first treatment
clusters_per_lin_df <- data.frame(matrix(ncol = 5, nrow = 0))
colnames(clusters_per_lin_df) <- c('Lineage', 'Percent_cells', 'Num_cells', 'Score')
for (i in names(clusters_per_lin_list)){
    clusters_per_lin_df <- rbind(clusters_per_lin_df, data.frame('Lineage' = i, 'Percent_cells' = clusters_per_lin_list[[i]]$Freq[clusters_per_lin_list[[i]]$Var1 == 1]/sum(clusters_per_lin_list[[i]]$Freq), 'Num_cells' = sum(clusters_per_lin_list[[i]]$Freq[clusters_per_lin_list[[i]]$Var1 == 1]), 'Score' = clusters_per_lin_list[[i]]$Score[1], 'Cluster' = 'NGFR')) # Add NGFR row
  clusters_per_lin_df <- rbind(clusters_per_lin_df, data.frame('Lineage' = i, 'Percent_cells' = clusters_per_lin_list[[i]]$Freq[clusters_per_lin_list[[i]]$Var1 == -1]/sum(clusters_per_lin_list[[i]]$Freq), 'Num_cells' = sum(clusters_per_lin_list[[i]]$Freq[clusters_per_lin_list[[i]]$Var1 == -1]), 'Score' = clusters_per_lin_list[[i]]$Score[1], 'Cluster' = 'EGFR')) # Add EGFR row
}

# Reorder so that EGFR dominant lineages are plot first
clusters_per_lin_df <- clusters_per_lin_df[with(clusters_per_lin_df, order(-Score,Num_cells )),]
clusters_per_lin_df$Lineage <- factor(clusters_per_lin_df$Lineage, levels = rev(unique(clusters_per_lin_df$Lineage)))

# make list object for after second treatment
clusters_per_lin_list_sec <- list()

# Need to get percent values of EGFR for the lineage after the second treatment
for (i in fivecell_cDNA$DabTram){
  currentlin <- filter(clusters_per_lin, clusters_per_lin$Lineage == i & clusters_per_lin$condition == 'dabtramtodabtram')
  Var1 <- c(-1,1)
  Freq <- c(sum(filter(clusters_per_lin, clusters_per_lin$Lineage == i & clusters_per_lin$condition == 'dabtramtodabtram')$Cluster == -1), # EGFR
  sum(filter(clusters_per_lin, clusters_per_lin$Lineage == i & clusters_per_lin$condition == 'dabtramtodabtram')$Cluster == 1))
  clusters_per_lin_list_sec[[i]] <- data.frame('Var1' = Var1, 'Freq' = Freq)
  clusters_per_lin_list_sec[[i]]$Score <- weighted.mean(as.numeric(as.character(clusters_per_lin_list_sec[[i]]$Var1)), clusters_per_lin_list_sec[[i]]$Freq)
}

# Build a dataframe for plotting based on % EGFR or NGFR per lineage after second treatment
clusters_per_lin_df_sec <- data.frame(matrix(ncol = 5, nrow = 0))
colnames(clusters_per_lin_df_sec) <- c('Lineage', 'Percent_cells', 'Num_cells', 'Score', 'Cluster')
for (i in names(clusters_per_lin_list)){

  if (sum(clusters_per_lin_list_sec[[i]]$Freq) < 5){
    clusters_per_lin_df_sec <- rbind(clusters_per_lin_df_sec, data.frame('Lineage' = i, 'Percent_cells' = 1, 'Num_cells' = 0, 'Score' = 0, 'Cluster' = 'Died')) # Add Lineage died row
    clusters_per_lin_df_sec <- rbind(clusters_per_lin_df_sec, data.frame('Lineage' = i, 'Percent_cells' = 0, 'Num_cells' = 0, 'Score' = 0, 'Cluster' = 'NGFR')) # Add NGFR row
    clusters_per_lin_df_sec <- rbind(clusters_per_lin_df_sec, data.frame('Lineage' = i, 'Percent_cells' = 0, 'Num_cells' = 0, 'Score' = 0, 'Cluster' = 'EGFR')) # Add EGFR row
  }else{ # Actually calculate percentages since the lineage survived/is more than 5 cells
      clusters_per_lin_df_sec <- rbind(clusters_per_lin_df_sec, data.frame('Lineage' = i, 'Percent_cells' = 0, 'Num_cells' = 0, 'Score' = clusters_per_lin_list_sec[[i]]$Score[1], 'Cluster' = 'Died')) # Add Lineage died row
      clusters_per_lin_df_sec <- rbind(clusters_per_lin_df_sec, data.frame('Lineage' = i, 'Percent_cells' = clusters_per_lin_list_sec[[i]]$Freq[clusters_per_lin_list_sec[[i]]$Var1 == 1]/sum(clusters_per_lin_list_sec[[i]]$Freq), 'Num_cells' = sum(clusters_per_lin_list_sec[[i]]$Freq[clusters_per_lin_list_sec[[i]]$Var1 == 1]), 'Score' = clusters_per_lin_list_sec[[i]]$Score[1], 'Cluster' = 'NGFR')) # Add NGFR row
      clusters_per_lin_df_sec <- rbind(clusters_per_lin_df_sec, data.frame('Lineage' = i, 'Percent_cells' = clusters_per_lin_list_sec[[i]]$Freq[clusters_per_lin_list_sec[[i]]$Var1 == -1]/sum(clusters_per_lin_list_sec[[i]]$Freq), 'Num_cells' = sum(clusters_per_lin_list_sec[[i]]$Freq[clusters_per_lin_list_sec[[i]]$Var1 == -1]), 'Score' = clusters_per_lin_list_sec[[i]]$Score[1], 'Cluster' = 'EGFR')) # Add EGFR row
    }
}

# Reorder so that EGFR dominant lineages are plot first
clusters_per_lin_df_sec$Lineage <- factor(clusters_per_lin_df_sec$Lineage, levels = rev(unique(clusters_per_lin_df$Lineage)))

# Plot
p1 <- ggplot(clusters_per_lin_df, aes(y = Percent_cells, x = Lineage, fill = Cluster)) + geom_bar(stat = 'identity', position = position_fill(reverse = T), color = '#D3D3D3') + scale_fill_manual(values = c("#000000","#FFFFFF")) + theme_classic() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
p2 <- ggplot(clusters_per_lin_df_sec, aes(y = Percent_cells, x = Lineage, fill = Cluster)) + geom_bar(stat = 'identity', position = position_fill(reverse = T), color = '#D3D3D3') + scale_fill_manual(values = c("#FF0000","#000000", '#FFFFFF')) + theme_classic() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

pdf('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/stacked_bar_EGFR_NGFR_Died.pdf')
ggarrange(p1,p2, nrow = 2)
dev.off()
null device 
          1 

Look at whether lineages cluster together in each individual condition - Starting with DabTram

# Get the number of cells in the DabTram resistant lineages in the conditions that got DabTram first
dabtramtococl2_dt_resist_lins <- list()
dabtramtocis_dt_resist_lins <- list()

for (i in fivecell_cDNA$DabTram){
  dabtramtococl2_dt_resist_lins[[i]] <- all_data$Lineage[all_data$Lineage == i & all_data$OG_condition == 'dabtramtococl2']
  dabtramtocis_dt_resist_lins[[i]] <- all_data$Lineage[all_data$Lineage == i & all_data$OG_condition == 'dabtramtocis']
}

# convert list to dataframe
dabtramtococl2_dt_resist_lins_df <- data.frame(num_cells = lengths(dabtramtococl2_dt_resist_lins))
dabtramtococl2_dt_resist_lins_df$Lineage = rownames(dabtramtococl2_dt_resist_lins_df)
dabtramtococl2_dt_resist_lins_df$Lineage <- factor(dabtramtococl2_dt_resist_lins_df$Lineage, levels = rev(unique(clusters_per_lin_df$Lineage)))

dabtramtocis_dt_resist_lins_df <- data.frame(num_cells = lengths(dabtramtocis_dt_resist_lins))
dabtramtocis_dt_resist_lins_df$Lineage = rownames(dabtramtocis_dt_resist_lins_df)
dabtramtocis_dt_resist_lins_df$Lineage <- factor(dabtramtocis_dt_resist_lins_df$Lineage, levels = rev(unique(clusters_per_lin_df$Lineage)))

# Plot 
p3 <- ggplot(dabtramtococl2_dt_resist_lins_df, aes(y = log(num_cells+1), x = Lineage)) + geom_col(fill = '#A2248E') + theme_classic() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + labs(title = 'DabTram to CoCl2')

p4 <- ggplot(dabtramtocis_dt_resist_lins_df, aes(y = log(num_cells+1), x = Lineage)) + geom_col(fill = '#9D85BE') + theme_classic() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + labs(title = 'DabTram to Cis') 

pdf('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/stacked_bar_EGFR_NGFR_Died_w_other_second_drugs.pdf', height = 14)
ggarrange(p1+ theme(legend.position = 'bottom'),p2+ theme(legend.position = 'bottom'),p3,p4, nrow = 4)
dev.off()
null device 
          1 

Significance testing of the dabtram simulation

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_dabtram <- mean(unlist(lapply(dabtram_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_dabtram_sim <- sapply(1:length(dabtram_lin_clust_rand_list), function(y)
  mean(unlist(lapply(dabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_dabtram <- (mean_dabtram-mean(means_dabtram_sim))/sd(means_dabtram_sim)
pval_mean_dabtram <- pnorm(z_mean_dabtram, mean(means_dabtram_sim), sd(means_dabtram_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_dabtram <- weighted.mean(unlist(lapply(dabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(dabtram_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_dabtram_sim <- sapply(1:length(dabtram_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(dabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(dabtram_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_dabtram <- (weighted_mean_dabtram-mean(weighted_means_dabtram_sim))/sd(weighted_means_dabtram_sim)
pval_wmean_dabtram <- pnorm(z_wmean_dabtram, mean(weighted_means_dabtram_sim), sd(weighted_means_dabtram_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_dabtram <- c()
for (i in 1:length(means_dabtram_sim)){
  sim_maxes <- unlist(lapply(dabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_dabtram <- cbind(ttest_pval_dabtram,t.test(x = unlist(lapply(dabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(dabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(dabtram_lin_clust_list, dabtram_lin_clust_rand_list,z_mean_dabtram,pval_mean_dabtram, z_wmean_dabtram, ttest_pval_dabtram, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/dabtram_sim_results.RData')
rm(dabtram)

Look at whether lineages cluster together in each individual condition - DabTramtoDabTram

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to dabtramtodabtram
dabtramtodabtram <- subset(all_data, idents = 'dabtramtodabtram') # Subset down to the dabtramtodabtram object

ElbowPlot(dabtramtodabtram) # The standard deviation seems to really level off at 10

# Recluster with the appropriate number of dimensions
dabtramtodabtram <- FindNeighbors(dabtramtodabtram, dims = 1:10)
dabtramtodabtram <- FindClusters(dabtramtodabtram, resolution = 0.5)
dabtramtodabtram <- RunUMAP(dabtramtodabtram, dims = 1:10)
DimPlot(dabtramtodabtram, reduction = 'umap')

# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
dabtramtodabtram_lin_clust_list <- list()

for (i in fivecell_cDNA$DabTramtoDabTram){
  temp_df <- as.data.frame(table(Idents(dabtramtodabtram)[dabtramtodabtram$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  dabtramtodabtram_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
dabtramtodabtram_lin_clust_rand_list <- list()
num_iter <- 800 
for(j in 1:num_iter){
  set.seed(j)
  dabtramtodabtram_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$DabTramtoDabTram){
    num_cells <- length(dabtramtodabtram$Lineage[dabtramtodabtram$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(dabtramtodabtram), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    dabtramtodabtram_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Significance testing of the dabtramtodabtram simulation

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_dabtramtodabtram <- mean(unlist(lapply(dabtramtodabtram_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_dabtramtodabtram_sim <- sapply(1:length(dabtramtodabtram_lin_clust_rand_list), function(y)
  mean(unlist(lapply(dabtramtodabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_dabtramtodabtram <- (mean_dabtramtodabtram-mean(means_dabtramtodabtram_sim))/sd(means_dabtramtodabtram_sim)
pval_mean_dabtramtodabtram <- pnorm(z_mean_dabtramtodabtram, mean(means_dabtramtodabtram_sim), sd(means_dabtramtodabtram_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_dabtramtodabtram <- weighted.mean(unlist(lapply(dabtramtodabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(dabtramtodabtram_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_dabtramtodabtram_sim <- sapply(1:length(dabtramtodabtram_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(dabtramtodabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(dabtramtodabtram_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_dabtramtodabtram <- (weighted_mean_dabtramtodabtram-mean(weighted_means_dabtramtodabtram_sim))/sd(weighted_means_dabtramtodabtram_sim)
pval_wmean_dabtramtodabtram <- pnorm(z_wmean_dabtramtodabtram, mean(weighted_means_dabtramtodabtram_sim), sd(weighted_means_dabtramtodabtram_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_dabtramtodabtram <- c()
for (i in 1:length(means_dabtramtodabtram_sim)){
  sim_maxes <- unlist(lapply(dabtramtodabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_dabtramtodabtram <- cbind(ttest_pval_dabtramtodabtram,t.test(x = unlist(lapply(dabtramtodabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(dabtramtodabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(dabtramtodabtram_lin_clust_list, dabtramtodabtram_lin_clust_rand_list,z_mean_dabtramtodabtram,pval_mean_dabtramtodabtram, z_wmean_dabtramtodabtram, ttest_pval_dabtramtodabtram, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/dabtramtodabtram_sim_results.RData')
rm(dabtramtodabtram)

Look at whether lineages cluster together in each individual condition - DabTramtoCis

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to dabtramtocis
dabtramtocis <- subset(all_data, idents = 'dabtramtocis') # Subset down to the dabtramtocis object

ElbowPlot(dabtramtocis) # The standard deviation seems to really level off at 10

# Recluster with the appropriate number of dimensions
dabtramtocis <- FindNeighbors(dabtramtocis, dims = 1:10)
dabtramtocis <- FindClusters(dabtramtocis, resolution = 0.5)
dabtramtocis <- RunUMAP(dabtramtocis, dims = 1:10)
DimPlot(dabtramtocis, reduction = 'umap')

# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
dabtramtocis_lin_clust_list <- list()

for (i in fivecell_cDNA$DabTramtoCis){
  temp_df <- as.data.frame(table(Idents(dabtramtocis)[dabtramtocis$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  dabtramtocis_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
dabtramtocis_lin_clust_rand_list <- list()
num_iter <- 800 
for(j in 1:num_iter){
  set.seed(j)
  dabtramtocis_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$DabTramtoCis){
    num_cells <- length(dabtramtocis$Lineage[dabtramtocis$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(dabtramtocis), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    dabtramtocis_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Significance testing of the dabtramtocis simulation

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_dabtramtocis <- mean(unlist(lapply(dabtramtocis_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_dabtramtocis_sim <- sapply(1:length(dabtramtocis_lin_clust_rand_list), function(y)
  mean(unlist(lapply(dabtramtocis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_dabtramtocis <- (mean_dabtramtocis-mean(means_dabtramtocis_sim))/sd(means_dabtramtocis_sim)
pval_mean_dabtramtocis <- pnorm(z_mean_dabtramtocis, mean(means_dabtramtocis_sim), sd(means_dabtramtocis_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_dabtramtocis <- weighted.mean(unlist(lapply(dabtramtocis_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(dabtramtocis_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_dabtramtocis_sim <- sapply(1:length(dabtramtocis_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(dabtramtocis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(dabtramtocis_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_dabtramtocis <- (weighted_mean_dabtramtocis-mean(weighted_means_dabtramtocis_sim))/sd(weighted_means_dabtramtocis_sim)
pval_wmean_dabtramtocis <- pnorm(z_wmean_dabtramtocis, mean(weighted_means_dabtramtocis_sim), sd(weighted_means_dabtramtocis_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_dabtramtocis <- c()
for (i in 1:length(means_dabtramtocis_sim)){
  sim_maxes <- unlist(lapply(dabtramtocis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_dabtramtocis <- cbind(ttest_pval_dabtramtocis,t.test(x = unlist(lapply(dabtramtocis_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(dabtramtocis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(dabtramtocis_lin_clust_list, dabtramtocis_lin_clust_rand_list,z_mean_dabtramtocis,pval_mean_dabtramtocis, z_wmean_dabtramtocis, ttest_pval_dabtramtocis, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/dabtramtocis_sim_results.RData')
rm(dabtramtocis)

Look at whether lineages cluster together in each individual condition - DabTramtoCis

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to dabtramtococl2
dabtramtococl2 <- subset(all_data, idents = 'dabtramtococl2') # Subset down to the dabtramtococl2 object

ElbowPlot(dabtramtococl2) # The standard deviation seems to really level off at 10

# Recluster with the appropriate number of dimensions
dabtramtococl2 <- FindNeighbors(dabtramtococl2, dims = 1:10)
dabtramtococl2 <- FindClusters(dabtramtococl2, resolution = 0.5)
dabtramtococl2 <- RunUMAP(dabtramtococl2, dims = 1:10)
DimPlot(dabtramtococl2, reduction = 'umap')

# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
dabtramtococl2_lin_clust_list <- list()

for (i in fivecell_cDNA$DabTramtoCoCl2){
  temp_df <- as.data.frame(table(Idents(dabtramtococl2)[dabtramtococl2$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  dabtramtococl2_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
dabtramtococl2_lin_clust_rand_list <- list()
num_iter <- 800 
for(j in 1:num_iter){
  set.seed(j)
  dabtramtococl2_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$DabTramtoCoCl2){
    num_cells <- length(dabtramtococl2$Lineage[dabtramtococl2$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(dabtramtococl2), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    dabtramtococl2_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Significance testing of the dabtramtococl2 simulation

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_dabtramtococl2 <- mean(unlist(lapply(dabtramtococl2_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_dabtramtococl2_sim <- sapply(1:length(dabtramtococl2_lin_clust_rand_list), function(y)
  mean(unlist(lapply(dabtramtococl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_dabtramtococl2 <- (mean_dabtramtococl2-mean(means_dabtramtococl2_sim))/sd(means_dabtramtococl2_sim)
pval_mean_dabtramtococl2 <- pnorm(z_mean_dabtramtococl2, mean(means_dabtramtococl2_sim), sd(means_dabtramtococl2_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_dabtramtococl2 <- weighted.mean(unlist(lapply(dabtramtococl2_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(dabtramtococl2_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_dabtramtococl2_sim <- sapply(1:length(dabtramtococl2_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(dabtramtococl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(dabtramtococl2_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_dabtramtococl2 <- (weighted_mean_dabtramtococl2-mean(weighted_means_dabtramtococl2_sim))/sd(weighted_means_dabtramtococl2_sim)
pval_wmean_dabtramtococl2 <- pnorm(z_wmean_dabtramtococl2, mean(weighted_means_dabtramtococl2_sim), sd(weighted_means_dabtramtococl2_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_dabtramtococl2 <- c()
for (i in 1:length(means_dabtramtococl2_sim)){
  sim_maxes <- unlist(lapply(dabtramtococl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_dabtramtococl2 <- cbind(ttest_pval_dabtramtococl2,t.test(x = unlist(lapply(dabtramtococl2_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(dabtramtococl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(dabtramtococl2_lin_clust_list, dabtramtococl2_lin_clust_rand_list,z_mean_dabtramtococl2,pval_mean_dabtramtococl2, z_wmean_dabtramtococl2, ttest_pval_dabtramtococl2, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/dabtramtococl2_sim_results.RData')
rm(dabtramtococl2)

Look at whether lineages cluster together in each individual condition - Starting with DabTram

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cocl2
cocl2 <- subset(all_data, idents = 'cocl2') # Subset down to the cocl2 object

ElbowPlot(cocl2) # The standard deviation seems to really level off at 10

# Recluster with the appropriate number of dimensions
cocl2 <- FindNeighbors(cocl2, dims = 1:10)
cocl2 <- FindClusters(cocl2, resolution = 0.5)
cocl2 <- RunUMAP(cocl2, dims = 1:10)
DimPlot(cocl2, reduction = 'umap')

# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cocl2_lin_clust_list <- list()

for (i in fivecell_cDNA$CoCl2){
  temp_df <- as.data.frame(table(Idents(cocl2)[cocl2$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cocl2_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cocl2_lin_clust_rand_list <- list()
num_iter <- 800 
for(j in 1:num_iter){
  set.seed(j)
  cocl2_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$CoCl2){
    num_cells <- length(cocl2$Lineage[cocl2$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cocl2), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cocl2_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Significance testing of the cocl2 simulation

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cocl2 <- mean(unlist(lapply(cocl2_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cocl2_sim <- sapply(1:length(cocl2_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cocl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cocl2 <- (mean_cocl2-mean(means_cocl2_sim))/sd(means_cocl2_sim)
pval_mean_cocl2 <- pnorm(z_mean_cocl2, mean(means_cocl2_sim), sd(means_cocl2_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cocl2 <- weighted.mean(unlist(lapply(cocl2_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cocl2_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cocl2_sim <- sapply(1:length(cocl2_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cocl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cocl2_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cocl2 <- (weighted_mean_cocl2-mean(weighted_means_cocl2_sim))/sd(weighted_means_cocl2_sim)
pval_wmean_cocl2 <- pnorm(z_wmean_cocl2, mean(weighted_means_cocl2_sim), sd(weighted_means_cocl2_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cocl2 <- c()
for (i in 1:length(means_cocl2_sim)){
  sim_maxes <- unlist(lapply(cocl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cocl2 <- cbind(ttest_pval_cocl2,t.test(x = unlist(lapply(cocl2_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cocl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cocl2_lin_clust_list, cocl2_lin_clust_rand_list,z_mean_cocl2,pval_mean_cocl2, z_wmean_cocl2, ttest_pval_cocl2, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cocl2_sim_results.RData')
rm(cocl2)

Look at whether lineages cluster together in each individual condition - Starting with CoCl2toCoCl2

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cocl2tococl2
cocl2tococl2 <- subset(all_data, idents = 'cocl2tococl2') # Subset down to the cocl2tococl2 object

ElbowPlot(cocl2tococl2) # The standard deviation seems to really level off at 10

# Recluster with the appropriate number of dimensions
cocl2tococl2 <- FindNeighbors(cocl2tococl2, dims = 1:10)
cocl2tococl2 <- FindClusters(cocl2tococl2, resolution = 0.5)
cocl2tococl2 <- RunUMAP(cocl2tococl2, dims = 1:10)
DimPlot(cocl2tococl2, reduction = 'umap')

# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cocl2tococl2_lin_clust_list <- list()

for (i in fivecell_cDNA$CoCl2toCoCl2){
  temp_df <- as.data.frame(table(Idents(cocl2tococl2)[cocl2tococl2$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cocl2tococl2_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cocl2tococl2_lin_clust_rand_list <- list()
num_iter <- 800 
for(j in 1:num_iter){
  set.seed(j)
  cocl2tococl2_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$CoCl2toCoCl2){
    num_cells <- length(cocl2tococl2$Lineage[cocl2tococl2$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cocl2tococl2), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cocl2tococl2_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Significance testing of the cocl2tococl2 simulation

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cocl2tococl2 <- mean(unlist(lapply(cocl2tococl2_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cocl2tococl2_sim <- sapply(1:length(cocl2tococl2_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cocl2tococl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cocl2tococl2 <- (mean_cocl2tococl2-mean(means_cocl2tococl2_sim))/sd(means_cocl2tococl2_sim)
pval_mean_cocl2tococl2 <- pnorm(z_mean_cocl2tococl2, mean(means_cocl2tococl2_sim), sd(means_cocl2tococl2_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cocl2tococl2 <- weighted.mean(unlist(lapply(cocl2tococl2_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cocl2tococl2_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cocl2tococl2_sim <- sapply(1:length(cocl2tococl2_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cocl2tococl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cocl2tococl2_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cocl2tococl2 <- (weighted_mean_cocl2tococl2-mean(weighted_means_cocl2tococl2_sim))/sd(weighted_means_cocl2tococl2_sim)
pval_wmean_cocl2tococl2 <- pnorm(z_wmean_cocl2tococl2, mean(weighted_means_cocl2tococl2_sim), sd(weighted_means_cocl2tococl2_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cocl2tococl2 <- c()
for (i in 1:length(means_cocl2tococl2_sim)){
  sim_maxes <- unlist(lapply(cocl2tococl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cocl2tococl2 <- cbind(ttest_pval_cocl2tococl2,t.test(x = unlist(lapply(cocl2tococl2_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cocl2tococl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cocl2tococl2_lin_clust_list, cocl2tococl2_lin_clust_rand_list,z_mean_cocl2tococl2,pval_mean_cocl2tococl2, z_wmean_cocl2tococl2, ttest_pval_cocl2tococl2, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cocl2tococl2_sim_results.RData')
rm(cocl2tococl2)

Look at whether lineages cluster together in each individual condition - Starting with CoCl2toCis

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cocl2tocis
cocl2tocis <- subset(all_data, idents = 'cocl2tocis') # Subset down to the cocl2tocis object

ElbowPlot(cocl2tocis) # The standard deviation seems to really level off at 10

# Recluster with the appropriate number of dimensions
cocl2tocis <- FindNeighbors(cocl2tocis, dims = 1:10)
cocl2tocis <- FindClusters(cocl2tocis, resolution = 0.5)
cocl2tocis <- RunUMAP(cocl2tocis, dims = 1:10)
DimPlot(cocl2tocis, reduction = 'umap')

# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cocl2tocis_lin_clust_list <- list()

for (i in fivecell_cDNA$CoCl2toCis){
  temp_df <- as.data.frame(table(Idents(cocl2tocis)[cocl2tocis$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cocl2tocis_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cocl2tocis_lin_clust_rand_list <- list()
num_iter <- 800 
for(j in 1:num_iter){
  set.seed(j)
  cocl2tocis_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$CoCl2toCis){
    num_cells <- length(cocl2tocis$Lineage[cocl2tocis$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cocl2tocis), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cocl2tocis_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Significance testing of the cocl2tocis simulation

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cocl2tocis <- mean(unlist(lapply(cocl2tocis_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cocl2tocis_sim <- sapply(1:length(cocl2tocis_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cocl2tocis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cocl2tocis <- (mean_cocl2tocis-mean(means_cocl2tocis_sim))/sd(means_cocl2tocis_sim)
pval_mean_cocl2tocis <- pnorm(z_mean_cocl2tocis, mean(means_cocl2tocis_sim), sd(means_cocl2tocis_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cocl2tocis <- weighted.mean(unlist(lapply(cocl2tocis_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cocl2tocis_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cocl2tocis_sim <- sapply(1:length(cocl2tocis_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cocl2tocis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cocl2tocis_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cocl2tocis <- (weighted_mean_cocl2tocis-mean(weighted_means_cocl2tocis_sim))/sd(weighted_means_cocl2tocis_sim)
pval_wmean_cocl2tocis <- pnorm(z_wmean_cocl2tocis, mean(weighted_means_cocl2tocis_sim), sd(weighted_means_cocl2tocis_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cocl2tocis <- c()
for (i in 1:length(means_cocl2tocis_sim)){
  sim_maxes <- unlist(lapply(cocl2tocis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cocl2tocis <- cbind(ttest_pval_cocl2tocis,t.test(x = unlist(lapply(cocl2tocis_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cocl2tocis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cocl2tocis_lin_clust_list, cocl2tocis_lin_clust_rand_list,z_mean_cocl2tocis,pval_mean_cocl2tocis, z_wmean_cocl2tocis, ttest_pval_cocl2tocis, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cocl2tocis_sim_results.RData')
rm(cocl2tocis)

Look at whether lineages cluster together in each individual condition - Starting with CoCl2toDabTram

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cocl2todabtram
cocl2todabtram <- subset(all_data, idents = 'cocl2todabtram') # Subset down to the cocl2todabtram object

ElbowPlot(cocl2todabtram) # The standard deviation seems to really level off at 10

# Recluster with the appropriate number of dimensions
cocl2todabtram <- FindNeighbors(cocl2todabtram, dims = 1:10)
cocl2todabtram <- FindClusters(cocl2todabtram, resolution = 0.5)
cocl2todabtram <- RunUMAP(cocl2todabtram, dims = 1:10)
DimPlot(cocl2todabtram, reduction = 'umap')

# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cocl2todabtram_lin_clust_list <- list()

for (i in fivecell_cDNA$CoCl2toDabTram){
  temp_df <- as.data.frame(table(Idents(cocl2todabtram)[cocl2todabtram$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cocl2todabtram_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cocl2todabtram_lin_clust_rand_list <- list()
num_iter <- 800 
for(j in 1:num_iter){
  set.seed(j)
  cocl2todabtram_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$CoCl2toDabTram){
    num_cells <- length(cocl2todabtram$Lineage[cocl2todabtram$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cocl2todabtram), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cocl2todabtram_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Significance testing of the cocl2todabtram simulation

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cocl2todabtram <- mean(unlist(lapply(cocl2todabtram_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cocl2todabtram_sim <- sapply(1:length(cocl2todabtram_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cocl2todabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cocl2todabtram <- (mean_cocl2todabtram-mean(means_cocl2todabtram_sim))/sd(means_cocl2todabtram_sim)
pval_mean_cocl2todabtram <- pnorm(z_mean_cocl2todabtram, mean(means_cocl2todabtram_sim), sd(means_cocl2todabtram_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cocl2todabtram <- weighted.mean(unlist(lapply(cocl2todabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cocl2todabtram_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cocl2todabtram_sim <- sapply(1:length(cocl2todabtram_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cocl2todabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cocl2todabtram_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cocl2todabtram <- (weighted_mean_cocl2todabtram-mean(weighted_means_cocl2todabtram_sim))/sd(weighted_means_cocl2todabtram_sim)
pval_wmean_cocl2todabtram <- pnorm(z_wmean_cocl2todabtram, mean(weighted_means_cocl2todabtram_sim), sd(weighted_means_cocl2todabtram_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cocl2todabtram <- c()
for (i in 1:length(means_cocl2todabtram_sim)){
  sim_maxes <- unlist(lapply(cocl2todabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cocl2todabtram <- cbind(ttest_pval_cocl2todabtram,t.test(x = unlist(lapply(cocl2todabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cocl2todabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cocl2todabtram_lin_clust_list, cocl2todabtram_lin_clust_rand_list,z_mean_cocl2todabtram,pval_mean_cocl2todabtram, z_wmean_cocl2todabtram, ttest_pval_cocl2todabtram, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cocl2todabtram_sim_results.RData')
rm(cocl2todabtram)

Look at whether lineages cluster together in each individual condition - Starting with Cis

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cis
cis <- subset(all_data, idents = 'cis') # Subset down to the cis object

ElbowPlot(cis) # The standard deviation seems to really level off at 10

# Recluster with the appropriate number of dimensions
cis <- FindNeighbors(cis, dims = 1:10)
cis <- FindClusters(cis, resolution = 0.5)
cis <- RunUMAP(cis, dims = 1:10)
DimPlot(cis, reduction = 'umap')

# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cis_lin_clust_list <- list()

for (i in fivecell_cDNA$Cis){
  temp_df <- as.data.frame(table(Idents(cis)[cis$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cis_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cis_lin_clust_rand_list <- list()
num_iter <- 800 
for(j in 1:num_iter){
  set.seed(j)
  cis_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$Cis){
    num_cells <- length(cis$Lineage[cis$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cis), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cis_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Significance testing of the cis simulation

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cis <- mean(unlist(lapply(cis_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cis_sim <- sapply(1:length(cis_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cis <- (mean_cis-mean(means_cis_sim))/sd(means_cis_sim)
pval_mean_cis <- pnorm(z_mean_cis, mean(means_cis_sim), sd(means_cis_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cis <- weighted.mean(unlist(lapply(cis_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cis_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cis_sim <- sapply(1:length(cis_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cis_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cis <- (weighted_mean_cis-mean(weighted_means_cis_sim))/sd(weighted_means_cis_sim)
pval_wmean_cis <- pnorm(z_wmean_cis, mean(weighted_means_cis_sim), sd(weighted_means_cis_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cis <- c()
for (i in 1:length(means_cis_sim)){
  sim_maxes <- unlist(lapply(cis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cis <- cbind(ttest_pval_cis,t.test(x = unlist(lapply(cis_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cis_lin_clust_list, cis_lin_clust_rand_list,z_mean_cis,pval_mean_cis, z_wmean_cis, ttest_pval_cis, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cis_sim_results.RData')
rm(cis)

Look at whether lineages cluster together in each individual condition - Starting with cistocis

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cistocis
cistocis <- subset(all_data, idents = 'cistocis') # Subset down to the cistocis object

ElbowPlot(cistocis) # The standard deviation seems to really level off at 10

# Recluster with the appropriate number of dimensions
cistocis <- FindNeighbors(cistocis, dims = 1:10)
cistocis <- FindClusters(cistocis, resolution = 0.5)
cistocis <- RunUMAP(cistocis, dims = 1:10)
DimPlot(cistocis, reduction = 'umap')

# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cistocis_lin_clust_list <- list()

for (i in fivecell_cDNA$CistoCis){
  temp_df <- as.data.frame(table(Idents(cistocis)[cistocis$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cistocis_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cistocis_lin_clust_rand_list <- list()
num_iter <- 800 
for(j in 1:num_iter){
  set.seed(j)
  cistocis_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$CistoCis){
    num_cells <- length(cistocis$Lineage[cistocis$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cistocis), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cistocis_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Significance testing of the cistocis simulation

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cistocis <- mean(unlist(lapply(cistocis_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cistocis_sim <- sapply(1:length(cistocis_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cistocis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cistocis <- (mean_cistocis-mean(means_cistocis_sim))/sd(means_cistocis_sim)
pval_mean_cistocis <- pnorm(z_mean_cistocis, mean(means_cistocis_sim), sd(means_cistocis_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cistocis <- weighted.mean(unlist(lapply(cistocis_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cistocis_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cistocis_sim <- sapply(1:length(cistocis_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cistocis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cistocis_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cistocis <- (weighted_mean_cistocis-mean(weighted_means_cistocis_sim))/sd(weighted_means_cistocis_sim)
pval_wmean_cistocis <- pnorm(z_wmean_cistocis, mean(weighted_means_cistocis_sim), sd(weighted_means_cistocis_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cistocis <- c()
for (i in 1:length(means_cistocis_sim)){
  sim_maxes <- unlist(lapply(cistocis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cistocis <- cbind(ttest_pval_cistocis,t.test(x = unlist(lapply(cistocis_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cistocis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cistocis_lin_clust_list, cistocis_lin_clust_rand_list,z_mean_cistocis,pval_mean_cistocis, z_wmean_cistocis, ttest_pval_cistocis, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cistocis_sim_results.RData')
rm(cistocis)

Look at whether lineages cluster together in each individual condition - Starting with cistodabtram

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cistodabtram
cistodabtram <- subset(all_data, idents = 'cistodabtram') # Subset down to the cistodabtram object

ElbowPlot(cistodabtram) # The standard deviation seems to really level off at 10

# Recluster with the appropriate number of dimensions
cistodabtram <- FindNeighbors(cistodabtram, dims = 1:10)
cistodabtram <- FindClusters(cistodabtram, resolution = 0.5)
cistodabtram <- RunUMAP(cistodabtram, dims = 1:10)
DimPlot(cistodabtram, reduction = 'umap')

# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cistodabtram_lin_clust_list <- list()

for (i in fivecell_cDNA$CistoDabTram){
  temp_df <- as.data.frame(table(Idents(cistodabtram)[cistodabtram$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cistodabtram_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cistodabtram_lin_clust_rand_list <- list()
num_iter <- 800 
for(j in 1:num_iter){
  set.seed(j)
  cistodabtram_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$CistoDabTram){
    num_cells <- length(cistodabtram$Lineage[cistodabtram$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cistodabtram), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cistodabtram_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Significance testing of the cistodabtram simulation

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cistodabtram <- mean(unlist(lapply(cistodabtram_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cistodabtram_sim <- sapply(1:length(cistodabtram_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cistodabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cistodabtram <- (mean_cistodabtram-mean(means_cistodabtram_sim))/sd(means_cistodabtram_sim)
pval_mean_cistodabtram <- pnorm(z_mean_cistodabtram, mean(means_cistodabtram_sim), sd(means_cistodabtram_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cistodabtram <- weighted.mean(unlist(lapply(cistodabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cistodabtram_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cistodabtram_sim <- sapply(1:length(cistodabtram_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cistodabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cistodabtram_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cistodabtram <- (weighted_mean_cistodabtram-mean(weighted_means_cistodabtram_sim))/sd(weighted_means_cistodabtram_sim)
pval_wmean_cistodabtram <- pnorm(z_wmean_cistodabtram, mean(weighted_means_cistodabtram_sim), sd(weighted_means_cistodabtram_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cistodabtram <- c()
for (i in 1:length(means_cistodabtram_sim)){
  sim_maxes <- unlist(lapply(cistodabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cistodabtram <- cbind(ttest_pval_cistodabtram,t.test(x = unlist(lapply(cistodabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cistodabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cistodabtram_lin_clust_list, cistodabtram_lin_clust_rand_list,z_mean_cistodabtram,pval_mean_cistodabtram, z_wmean_cistodabtram, ttest_pval_cistodabtram, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cistodabtram_sim_results.RData')
rm(cistodabtram)

Look at whether lineages cluster together in each individual condition - Starting with cistococl2

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cistococl2
cistococl2 <- subset(all_data, idents = 'cistococl2') # Subset down to the cistococl2 object

ElbowPlot(cistococl2) # The standard deviation seems to really level off at 10

# Recluster with the appropriate number of dimensions
cistococl2 <- FindNeighbors(cistococl2, dims = 1:10)
cistococl2 <- FindClusters(cistococl2, resolution = 0.5)
cistococl2 <- RunUMAP(cistococl2, dims = 1:10)
DimPlot(cistococl2, reduction = 'umap')

# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cistococl2_lin_clust_list <- list()

for (i in fivecell_cDNA$CistoCoCl2){
  temp_df <- as.data.frame(table(Idents(cistococl2)[cistococl2$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cistococl2_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cistococl2_lin_clust_rand_list <- list()
num_iter <- 800 
for(j in 1:num_iter){
  set.seed(j)
  cistococl2_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$CistoCoCl2){
    num_cells <- length(cistococl2$Lineage[cistococl2$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cistococl2), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cistococl2_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Significance testing of the cistococl2 simulation

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cistococl2 <- mean(unlist(lapply(cistococl2_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cistococl2_sim <- sapply(1:length(cistococl2_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cistococl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cistococl2 <- (mean_cistococl2-mean(means_cistococl2_sim))/sd(means_cistococl2_sim)
pval_mean_cistococl2 <- pnorm(z_mean_cistococl2, mean(means_cistococl2_sim), sd(means_cistococl2_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cistococl2 <- weighted.mean(unlist(lapply(cistococl2_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cistococl2_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cistococl2_sim <- sapply(1:length(cistococl2_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cistococl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cistococl2_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cistococl2 <- (weighted_mean_cistococl2-mean(weighted_means_cistococl2_sim))/sd(weighted_means_cistococl2_sim)
pval_wmean_cistococl2 <- pnorm(z_wmean_cistococl2, mean(weighted_means_cistococl2_sim), sd(weighted_means_cistococl2_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cistococl2 <- c()
for (i in 1:length(means_cistococl2_sim)){
  sim_maxes <- unlist(lapply(cistococl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cistococl2 <- cbind(ttest_pval_cistococl2,t.test(x = unlist(lapply(cistococl2_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cistococl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cistococl2_lin_clust_list, cistococl2_lin_clust_rand_list,z_mean_cistococl2,pval_mean_cistococl2, z_wmean_cistococl2, ttest_pval_cistococl2, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cistococl2_sim_results.RData')
rm(cistococl2)

Build dataframe of overall simulation results

sim_results <- rbind(
  dabtram <- data.frame("Mean_Zscore" = z_mean_dabtram, "Mean_pval" = pval_mean_dabtram, "Weighted_Mean_Zscore" = z_wmean_dabtram, "Weighted_Mean_pval" = pval_wmean_dabtram, ttest_sims_sig = sum(ttest_pval_dabtram <= 0.05)),
  dabtramtodabtram <- data.frame("Mean_Zscore" = z_mean_dabtramtodabtram, "Mean_pval" = pval_mean_dabtramtodabtram, "Weighted_Mean_Zscore" = z_wmean_dabtramtodabtram, "Weighted_Mean_pval" = pval_wmean_dabtramtodabtram, ttest_sims_sig = sum(ttest_pval_dabtramtodabtram <= 0.05)),
  dabtramtococl2 <- data.frame("Mean_Zscore" = z_mean_dabtramtococl2, "Mean_pval" = pval_mean_dabtramtococl2, "Weighted_Mean_Zscore" = z_wmean_dabtramtococl2, "Weighted_Mean_pval" = pval_wmean_dabtramtococl2, ttest_sims_sig = sum(ttest_pval_dabtramtococl2 <= 0.05)),
  dabtramtocis <- data.frame("Mean_Zscore" = z_mean_dabtramtocis, "Mean_pval" = pval_mean_dabtramtocis, "Weighted_Mean_Zscore" = z_wmean_dabtramtocis, "Weighted_Mean_pval" = pval_wmean_dabtramtocis, ttest_sims_sig = sum(ttest_pval_dabtramtocis <= 0.05)),
  cis <- data.frame("Mean_Zscore" = z_mean_cis, "Mean_pval" = pval_mean_cis, "Weighted_Mean_Zscore" = z_wmean_cis, "Weighted_Mean_pval" = pval_wmean_cis, ttest_sims_sig = sum(ttest_pval_cis <= 0.05)),
  cistodabtram <- data.frame("Mean_Zscore" = z_mean_cistodabtram, "Mean_pval" = pval_mean_cistodabtram, "Weighted_Mean_Zscore" = z_wmean_cistodabtram, "Weighted_Mean_pval" = pval_wmean_cistodabtram, ttest_sims_sig = sum(ttest_pval_cistodabtram <= 0.05)),
  cistococl2 <- data.frame("Mean_Zscore" = z_mean_cistococl2, "Mean_pval" = pval_mean_cistococl2, "Weighted_Mean_Zscore" = z_wmean_cistococl2, "Weighted_Mean_pval" = pval_wmean_cistococl2, ttest_sims_sig = sum(ttest_pval_cistococl2 <= 0.05)),
  cistocis <- data.frame("Mean_Zscore" = z_mean_cistocis, "Mean_pval" = pval_mean_cistocis, "Weighted_Mean_Zscore" = z_wmean_cistocis, "Weighted_Mean_pval" = pval_wmean_cistocis, ttest_sims_sig = sum(ttest_pval_cistocis <= 0.05)),
  cocl2 <- data.frame("Mean_Zscore" = z_mean_cocl2, "Mean_pval" = pval_mean_cocl2, "Weighted_Mean_Zscore" = z_wmean_cocl2, "Weighted_Mean_pval" = pval_wmean_cocl2, ttest_sims_sig = sum(ttest_pval_cocl2 <= 0.05)),
  cocl2todabtram <- data.frame("Mean_Zscore" = z_mean_cocl2todabtram, "Mean_pval" = pval_mean_cocl2todabtram, "Weighted_Mean_Zscore" = z_wmean_cocl2todabtram, "Weighted_Mean_pval" = pval_wmean_cocl2todabtram, ttest_sims_sig = sum(ttest_pval_cocl2todabtram <= 0.05)),
  cocl2tococl2 <- data.frame("Mean_Zscore" = z_mean_cocl2tococl2, "Mean_pval" = pval_mean_cocl2tococl2, "Weighted_Mean_Zscore" = z_wmean_cocl2tococl2, "Weighted_Mean_pval" = pval_wmean_cocl2tococl2, ttest_sims_sig = sum(ttest_pval_cocl2tococl2 <= 0.05)),
  cocl2tocis <- data.frame("Mean_Zscore" = z_mean_cocl2tocis, "Mean_pval" = pval_mean_cocl2tocis, "Weighted_Mean_Zscore" = z_wmean_cocl2tocis, "Weighted_Mean_pval" = pval_wmean_cocl2tocis, ttest_sims_sig = sum(ttest_pval_cocl2tocis <= 0.05))
)

rownames(sim_results) <- c("dabtram", "dabtramtodabtram", "dabtramtococl2", "dabtramtocis", "cis", "cistodabtram", "cistococl2", "cistocis", "cocl2", "cocl2todabtram", "cocl2tococl2", "cocl2tocis")

write.csv(sim_results, '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/sim_results.csv', row.names = T) 

Load simulation data back in

sim_results <- read.csv('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/sim_results.csv')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/dabtram_sim_results.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/dabtramtodabtram_sim_results.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/dabtramtococl2_sim_results.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/dabtramtocis_sim_results.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cocl2_sim_results.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cocl2todabtram_sim_results.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cocl2tococl2_sim_results.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cocl2tocis_sim_results.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cis_sim_results.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cistodabtram_sim_results.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cistococl2_sim_results.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cistocis_sim_results.RData')

Plot heatmaps of true percentage of cells per lineage in each cluster vs random simulations


breaks <- seq(0, 1, 0.1)

# DabTram
pdf('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/proportion_clusters_heatmaps.pdf', width = 16)
dabtram_pcnts <- as.data.frame(sapply(dabtram_lin_clust_list, '[[', 3))
cell_nums <- sapply(dabtram_lin_clust_list, function(x) sum(x$Num_cells))
rownames(dabtram_pcnts) <- c("0","1","2","3","4","5","6")
colnames(dabtram_pcnts) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
p <- pheatmap(dabtram_pcnts,cluster_rows = F, color = inferno(11), main = "DabTram", breaks = breaks) # 
p

dabtram_pcnts_rand <- as.data.frame(Reduce(`+`, lapply(dabtram_lin_clust_rand_list, function(x) {
  sapply(x, function(y) y$Pcnt_cells)
}))/ length(dabtram_lin_clust_rand_list))
rownames(dabtram_pcnts_rand) <- c("0","1","2","3","4","5","6")
colnames(dabtram_pcnts_rand) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
dabtram_pcnts_rand <- dabtram_pcnts_rand[,p$tree_col$order]
pheatmap(dabtram_pcnts_rand,cluster_rows = F, color = inferno(11), main = "DabTram Rand", breaks = breaks, cluster_cols = F)

# DabTram to DabTram
dabtramtodabtram_pcnts <- as.data.frame(sapply(dabtramtodabtram_lin_clust_list, '[[', 3))
cell_nums <- sapply(dabtramtodabtram_lin_clust_list, function(x) sum(x$Num_cells))
rownames(dabtramtodabtram_pcnts) <- c("0","1","2","3","4","5","6")
colnames(dabtramtodabtram_pcnts) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
p <- pheatmap(dabtramtodabtram_pcnts,cluster_rows = F, color = inferno(11), main = "DabTram to DabTram", breaks = breaks)
p

dabtramtodabtram_pcnts_rand <- as.data.frame(Reduce(`+`, lapply(dabtramtodabtram_lin_clust_rand_list, function(x) {
  sapply(x, function(y) y$Pcnt_cells)
}))/ length(dabtramtodabtram_lin_clust_rand_list))
rownames(dabtramtodabtram_pcnts_rand) <- c("0","1","2","3","4","5","6")
colnames(dabtramtodabtram_pcnts_rand) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
dabtramtodabtram_pcnts_rand <- dabtramtodabtram_pcnts_rand[,p$tree_col$order]
pheatmap(dabtramtodabtram_pcnts_rand,cluster_rows = F, color = inferno(11), main = "DabTram to DabTram Rand", breaks = breaks, cluster_cols = F)

# DabTram to CoCl2
dabtramtococl2_pcnts <- as.data.frame(sapply(dabtramtococl2_lin_clust_list, '[[', 3))
cell_nums <- sapply(dabtramtococl2_lin_clust_list, function(x) sum(x$Num_cells))
rownames(dabtramtococl2_pcnts) <- c("0","1","2","3","4","5","6","7")
colnames(dabtramtococl2_pcnts) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
p <- pheatmap(dabtramtococl2_pcnts,cluster_rows = F, color = inferno(11), main = "DabTram to CoCl2", breaks = breaks)
p

dabtramtococl2_pcnts_rand <- as.data.frame(Reduce(`+`, lapply(dabtramtococl2_lin_clust_rand_list, function(x) {
  sapply(x, function(y) y$Pcnt_cells)
}))/ length(dabtramtococl2_lin_clust_rand_list))
rownames(dabtramtococl2_pcnts_rand) <- c("0","1","2","3","4","5","6","7")
colnames(dabtramtococl2_pcnts_rand) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
dabtramtococl2_pcnts_rand <- dabtramtococl2_pcnts_rand[,p$tree_col$order]
pheatmap(dabtramtococl2_pcnts_rand,cluster_rows = F, color = inferno(11), main = "DabTram to CoCl2 Rand", breaks = breaks, cluster_cols = F)

# DabTram to Cis
dabtramtocis_pcnts <- as.data.frame(sapply(dabtramtocis_lin_clust_list, '[[', 3))
cell_nums <- sapply(dabtramtocis_lin_clust_list, function(x) sum(x$Num_cells))
rownames(dabtramtocis_pcnts) <- c("0","1","2","3","4","5","6")
colnames(dabtramtocis_pcnts) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
p <- pheatmap(dabtramtocis_pcnts,cluster_rows = F, color = inferno(11), main = "DabTram to Cis", breaks = breaks)
p

dabtramtocis_pcnts_rand <- as.data.frame(Reduce(`+`, lapply(dabtramtocis_lin_clust_rand_list, function(x) {
  sapply(x, function(y) y$Pcnt_cells)
}))/ length(dabtramtocis_lin_clust_rand_list))
rownames(dabtramtocis_pcnts_rand) <- c("0","1","2","3","4","5","6")
colnames(dabtramtocis_pcnts_rand) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
dabtramtocis_pcnts_rand <- dabtramtocis_pcnts_rand[,p$tree_col$order]
pheatmap(dabtramtocis_pcnts_rand,cluster_rows = F, color = inferno(11), main = "DabTram to Cis Rand", breaks = breaks, cluster_cols = F)

# CoCl2 objects
cocl2_pcnts <- as.data.frame(sapply(cocl2_lin_clust_list, '[[', 3))
cell_nums <- sapply(cocl2_lin_clust_list, function(x) sum(x$Num_cells))
rownames(cocl2_pcnts) <- c("0","1","2","3","4","5","6","7","8")
colnames(cocl2_pcnts) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
p <- pheatmap(cocl2_pcnts,cluster_rows = F, color = inferno(11), main = "CoCl2", breaks = breaks)
p

cocl2_pcnts_rand <- as.data.frame(Reduce(`+`, lapply(cocl2_lin_clust_rand_list, function(x) {
  sapply(x, function(y) y$Pcnt_cells)
}))/ length(cocl2_lin_clust_rand_list))
rownames(cocl2_pcnts_rand) <- c("0","1","2","3","4","5","6","7","8")
colnames(cocl2_pcnts_rand) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
cocl2_pcnts_rand <- cocl2_pcnts_rand[,p$tree_col$order]
pheatmap(cocl2_pcnts_rand,cluster_rows = F, color = inferno(11), main = "CoCl2 Rand", breaks = breaks, cluster_cols = F)

# CoCl2 to DabTram
cocl2todabtram_pcnts <- as.data.frame(sapply(cocl2todabtram_lin_clust_list, '[[', 3))
cell_nums <- sapply(cocl2todabtram_lin_clust_list, function(x) sum(x$Num_cells))
rownames(cocl2todabtram_pcnts) <- c("0","1","2","3","4","5","6")
colnames(cocl2todabtram_pcnts) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
p <- pheatmap(cocl2todabtram_pcnts,cluster_rows = F, color = inferno(11), main = "CoCl2 to DabTram", breaks = breaks)
p

cocl2todabtram_pcnts_rand <- as.data.frame(Reduce(`+`, lapply(cocl2todabtram_lin_clust_rand_list, function(x) {
  sapply(x, function(y) y$Pcnt_cells)
}))/ length(cocl2todabtram_lin_clust_rand_list))
rownames(cocl2todabtram_pcnts_rand) <- c("0","1","2","3","4","5","6")
colnames(cocl2todabtram_pcnts_rand) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
cocl2todabtram_pcnts_rand <- cocl2todabtram_pcnts_rand[,p$tree_col$order]
pheatmap(cocl2todabtram_pcnts_rand,cluster_rows = F, color = inferno(11), main = "CoCl2 to DabTram Rand", breaks = breaks, cluster_cols = F)

# CoCl2 to CoCl2
cocl2tococl2_pcnts <- as.data.frame(sapply(cocl2tococl2_lin_clust_list, '[[', 3))
cell_nums <- sapply(cocl2tococl2_lin_clust_list, function(x) sum(x$Num_cells))
rownames(cocl2tococl2_pcnts) <- c("0","1","2","3","4","5")
colnames(cocl2tococl2_pcnts) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
p <- pheatmap(cocl2tococl2_pcnts,cluster_rows = F, color = inferno(11), main = "CoCl2 to CoCl2", breaks = breaks)
p

cocl2tococl2_pcnts_rand <- as.data.frame(Reduce(`+`, lapply(cocl2tococl2_lin_clust_rand_list, function(x) {
  sapply(x, function(y) y$Pcnt_cells)
}))/ length(cocl2tococl2_lin_clust_rand_list))
rownames(cocl2tococl2_pcnts_rand) <- c("0","1","2","3","4","5")
colnames(cocl2tococl2_pcnts_rand) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
cocl2tococl2_pcnts_rand <- cocl2tococl2_pcnts_rand[,p$tree_col$order]
pheatmap(cocl2tococl2_pcnts_rand,cluster_rows = F, color = inferno(11), main = "CoCl2 to CoCl2 Rand", breaks = breaks, cluster_cols = F)

# CoCl2 to Cis
cocl2tocis_pcnts <- as.data.frame(sapply(cocl2tocis_lin_clust_list, '[[', 3))
cell_nums <- sapply(cocl2tocis_lin_clust_list, function(x) sum(x$Num_cells))
rownames(cocl2tocis_pcnts) <- c("0","1","2","3","4","5")
colnames(cocl2tocis_pcnts) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
p <- pheatmap(cocl2tocis_pcnts,cluster_rows = F, color = inferno(11), main = "CoCl2 to Cis", breaks = breaks)
p

cocl2tocis_pcnts_rand <- as.data.frame(Reduce(`+`, lapply(cocl2tocis_lin_clust_rand_list, function(x) {
  sapply(x, function(y) y$Pcnt_cells)
}))/ length(cocl2tocis_lin_clust_rand_list))
rownames(cocl2tocis_pcnts_rand) <- c("0","1","2","3","4","5")
colnames(cocl2tocis_pcnts_rand) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
cocl2tocis_pcnts_rand <- cocl2tocis_pcnts_rand[,p$tree_col$order]
pheatmap(cocl2tocis_pcnts_rand,cluster_rows = F, color = inferno(11), main = "CoCl2 to Cis Rand", breaks = breaks, cluster_cols = F)

# Cis 
cis_pcnts <- as.data.frame(sapply(cis_lin_clust_list, '[[', 3))
cell_nums <- sapply(cis_lin_clust_list, function(x) sum(x$Num_cells))
rownames(cis_pcnts) <- c("0","1","2","3","4","5","6","7")
colnames(cis_pcnts) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
p <- pheatmap(cis_pcnts,cluster_rows = F, color = inferno(10), main = "Cis", breaks = breaks)
p

cis_pcnts_rand <- as.data.frame(Reduce(`+`, lapply(cis_lin_clust_rand_list, function(x) {
  sapply(x, function(y) y$Pcnt_cells)
}))/ length(cis_lin_clust_rand_list))
rownames(cis_pcnts_rand) <- c("0","1","2","3","4","5","6","7")
colnames(cis_pcnts_rand) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
cis_pcnts_rand <- cis_pcnts_rand[,p$tree_col$order]
pheatmap(cis_pcnts_rand,cluster_rows = F, color = inferno(11), main = "Cis Rand", breaks = breaks, cluster_cols = F)

# Cis to DabTram
cistodabtram_pcnts <- as.data.frame(sapply(cistodabtram_lin_clust_list, '[[', 3))
cell_nums <- sapply(cistodabtram_lin_clust_list, function(x) sum(x$Num_cells))
rownames(cistodabtram_pcnts) <- c("0","1","2","3","4","5","6","7")
colnames(cistodabtram_pcnts) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
p <- pheatmap(cistodabtram_pcnts,cluster_rows = F, color = inferno(11), main = "Cis to DabTram", breaks = breaks)
p

cistodabtram_pcnts_rand <- as.data.frame(Reduce(`+`, lapply(cistodabtram_lin_clust_rand_list, function(x) {
  sapply(x, function(y) y$Pcnt_cells)
}))/ length(cistodabtram_lin_clust_rand_list))
rownames(cistodabtram_pcnts_rand) <- c("0","1","2","3","4","5","6","7")
colnames(cistodabtram_pcnts_rand) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
cistodabtram_pcnts_rand <- cistodabtram_pcnts_rand[,p$tree_col$order]
pheatmap(cistodabtram_pcnts_rand,cluster_rows = F, color = inferno(11), main = "Cis to DabTram Rand", breaks = breaks, cluster_cols = F)

# Cis to CoCl2
cistococl2_pcnts <- as.data.frame(sapply(cistococl2_lin_clust_list, '[[', 3))
cell_nums <- sapply(cistococl2_lin_clust_list, function(x) sum(x$Num_cells))
rownames(cistococl2_pcnts) <- c("0","1","2","3","4","5","6")
colnames(cistococl2_pcnts) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
p <- pheatmap(cistococl2_pcnts,cluster_rows = F, color = inferno(11), main = "Cis to CoCl2", breaks = breaks)
p

cistococl2_pcnts_rand <- as.data.frame(Reduce(`+`, lapply(cistococl2_lin_clust_rand_list, function(x) {
  sapply(x, function(y) y$Pcnt_cells)
}))/ length(cistococl2_lin_clust_rand_list))
rownames(cistococl2_pcnts_rand) <- c("0","1","2","3","4","5","6")
colnames(cistococl2_pcnts_rand) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
cistococl2_pcnts_rand <- cistococl2_pcnts_rand[,p$tree_col$order]
pheatmap(cistococl2_pcnts_rand,cluster_rows = F, color = inferno(11), main = "Cis to CoCl2 Rand", breaks = breaks, cluster_cols = F)

# Cis to Cis
cistocis_pcnts <- as.data.frame(sapply(cistocis_lin_clust_list, '[[', 3))
cell_nums <- sapply(cistocis_lin_clust_list, function(x) sum(x$Num_cells))
rownames(cistocis_pcnts) <- c("0","1","2","3","4","5","6","7","8")
colnames(cistocis_pcnts) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
p <- pheatmap(cistocis_pcnts,cluster_rows = F, color = inferno(11), main = "Cis to Cis", breaks = breaks)
p

cistocis_pcnts_rand <- as.data.frame(Reduce(`+`, lapply(cistocis_lin_clust_rand_list, function(x) {
  sapply(x, function(y) y$Pcnt_cells)
}))/ length(cistocis_lin_clust_rand_list))
rownames(cistocis_pcnts_rand) <- c("0","1","2","3","4","5","6","7","8")
colnames(cistocis_pcnts_rand) <- paste(names(cell_nums), rep('-',length(cell_nums)), cell_nums, rep('cells', length(cell_nums)))
cistocis_pcnts_rand <- cistocis_pcnts_rand[,p$tree_col$order]
pheatmap(cistocis_pcnts_rand,cluster_rows = F, color = inferno(11), main = "Cis to Cis Rand", breaks = breaks, cluster_cols = F)
dev.off()

plot the different test statistics - histogram of weighted means of maximum contribution to lineage vs true


pdf('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/weighted_mean_cluster_assignments_test_stats.pdf')
# DabTram
# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
wmean <- weighted.mean(unlist(lapply(dabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(dabtram_lin_clust_list, function(x) sum(x$Num_cells))))
df <- data.frame(weighted_mean = sapply(1:length(dabtram_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(dabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(dabtram_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells))))))

ggplot(df, aes(x = weighted_mean))+geom_histogram(fill = '#623594', color = 'black', binwidth = 0.005) + geom_vline(xintercept = wmean, linetype = 'dashed', color = 'red') + geom_text(aes(x = wmean+.03, label = round(wmean, 3), y = 500), color = 'red') + labs(y = 'Number of simulations', x = 'Weighted mean of percent of cells in dominant lineage', title = 'DabTram') + xlim(0.15, 0.65) + ylim(0,850) + geom_text(aes(x = wmean+.03, label = 'Observed', y = 525), color = 'red') + theme_classic()

# DabTram to DabTram
# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
wmean <- weighted.mean(unlist(lapply(dabtramtodabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(dabtramtodabtram_lin_clust_list, function(x) sum(x$Num_cells))))
df <- data.frame(weighted_mean = sapply(1:length(dabtramtodabtram_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(dabtramtodabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(dabtramtodabtram_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells))))))

ggplot(df, aes(x = weighted_mean))+geom_histogram(fill = '#561e59', color = 'black', binwidth = 0.005) + geom_vline(xintercept = wmean, linetype = 'dashed', color = 'red') + geom_text(aes(x = wmean+.03, label = round(wmean, 3), y = 500), color = 'red') + labs(y = 'Number of simulations', x = 'Weighted mean of percent of cells in dominant lineage', title = 'DabTram to DabTram') + xlim(0.15, 0.65) + ylim(0,850) + geom_text(aes(x = wmean+.03, label = 'Observed', y = 525), color = 'red') + theme_classic()

# DabTram to CoCl2
# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
wmean <- weighted.mean(unlist(lapply(dabtramtococl2_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(dabtramtococl2_lin_clust_list, function(x) sum(x$Num_cells))))
df <- data.frame(weighted_mean = sapply(1:length(dabtramtococl2_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(dabtramtococl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(dabtramtococl2_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells))))))

ggplot(df, aes(x = weighted_mean))+geom_histogram(fill = '#A2248E', color = 'black', binwidth = 0.005) + geom_vline(xintercept = wmean, linetype = 'dashed', color = 'red') + geom_text(aes(x = wmean+.03, label = round(wmean, 3), y = 500), color = 'red') + labs(y = 'Number of simulations', x = 'Weighted mean of percent of cells in dominant lineage', title = 'DabTram to CoCl2') + xlim(0.15, 0.65) + ylim(0,850) + geom_text(aes(x = wmean+.03, label = 'Observed', y = 525), color = 'red') + theme_classic()

# DabTram to Cis
# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
wmean <- weighted.mean(unlist(lapply(dabtramtocis_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(dabtramtocis_lin_clust_list, function(x) sum(x$Num_cells))))
df <- data.frame(weighted_mean = sapply(1:length(dabtramtocis_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(dabtramtocis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(dabtramtocis_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells))))))

ggplot(df, aes(x = weighted_mean))+geom_histogram(fill = '#9D85BE', color = 'black', binwidth = 0.005) + geom_vline(xintercept = wmean, linetype = 'dashed', color = 'red') + geom_text(aes(x = wmean+.03, label = round(wmean, 3), y = 500), color = 'red') + labs(y = 'Number of simulations', x = 'Weighted mean of percent of cells in dominant lineage', title = 'DabTram to Cis') + xlim(0.15, 0.65) + ylim(0,850) + geom_text(aes(x = wmean+.03, label = 'Observed', y = 525), color = 'red') + theme_classic()

# CoCl2
# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
wmean <- weighted.mean(unlist(lapply(cocl2_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cocl2_lin_clust_list, function(x) sum(x$Num_cells))))
df <- data.frame(weighted_mean = sapply(1:length(cocl2_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cocl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cocl2_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells))))))

ggplot(df, aes(x = weighted_mean))+geom_histogram(fill = '#0F8241', color = 'black', binwidth = 0.005) + geom_vline(xintercept = wmean, linetype = 'dashed', color = 'red') + geom_text(aes(x = wmean+.03, label = round(wmean, 3), y = 500), color = 'red') + labs(y = 'Number of simulations', x = 'Weighted mean of percent of cells in dominant lineage', title = 'CoCl2') + xlim(0.15, 0.65) + ylim(0,850) + geom_text(aes(x = wmean+.03, label = 'Observed', y = 525), color = 'red') + theme_classic()

# CoCl2 to DabTram
# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
wmean <- weighted.mean(unlist(lapply(cocl2todabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cocl2todabtram_lin_clust_list, function(x) sum(x$Num_cells))))
df <- data.frame(weighted_mean = sapply(1:length(cocl2todabtram_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cocl2todabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cocl2todabtram_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells))))))

ggplot(df, aes(x = weighted_mean))+geom_histogram(fill = '#10413B', color = 'black', binwidth = 0.005) + geom_vline(xintercept = wmean, linetype = 'dashed', color = 'red') + geom_text(aes(x = wmean+.03, label = round(wmean, 3), y = 500), color = 'red') + labs(y = 'Number of simulations', x = 'Weighted mean of percent of cells in dominant lineage', title = 'CoCl2 to DabTram') + xlim(0.15, 0.65) + ylim(0,850) + geom_text(aes(x = wmean+.03, label = 'Observed', y = 525), color = 'red') + theme_classic()

# CoCl2 to CoCl2
# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
wmean <- weighted.mean(unlist(lapply(cocl2tococl2_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cocl2tococl2_lin_clust_list, function(x) sum(x$Num_cells))))
df <- data.frame(weighted_mean = sapply(1:length(cocl2tococl2_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cocl2tococl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cocl2tococl2_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells))))))

ggplot(df, aes(x = weighted_mean))+geom_histogram(fill = '#6ABD45', color = 'black', binwidth = 0.005) + geom_vline(xintercept = wmean, linetype = 'dashed', color = 'red') + geom_text(aes(x = wmean+.03, label = round(wmean, 3), y = 500), color = 'red') + labs(y = 'Number of simulations', x = 'Weighted mean of percent of cells in dominant lineage', title = 'CoCl2 to CoCl2') + xlim(0.15, 0.65) + ylim(0,850) + geom_text(aes(x = wmean+.03, label = 'Observed', y = 525), color = 'red') + theme_classic()

# CoCl2 to Cis
# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
wmean <- weighted.mean(unlist(lapply(cocl2tocis_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cocl2tocis_lin_clust_list, function(x) sum(x$Num_cells))))
df <- data.frame(weighted_mean = sapply(1:length(cocl2tocis_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cocl2tocis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cocl2tocis_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells))))))

ggplot(df, aes(x = weighted_mean))+geom_histogram(fill = '#6DC49C', color = 'black', binwidth = 0.005) + geom_vline(xintercept = wmean, linetype = 'dashed', color = 'red') + geom_text(aes(x = wmean+.03, label = round(wmean, 3), y = 500), color = 'red') + labs(y = 'Number of simulations', x = 'Weighted mean of percent of cells in dominant lineage', title = 'CoCl2 to Cis') + xlim(0.15, 0.65) + ylim(0,850) + geom_text(aes(x = wmean+.03, label = 'Observed', y = 525), color = 'red') + theme_classic()

# Cis
# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
wmean <- weighted.mean(unlist(lapply(cis_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cis_lin_clust_list, function(x) sum(x$Num_cells))))
df <- data.frame(weighted_mean = sapply(1:length(cis_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cis_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells))))))

ggplot(df, aes(x = weighted_mean))+geom_histogram(fill = '#C96D29', color = 'black', binwidth = 0.005) + geom_vline(xintercept = wmean, linetype = 'dashed', color = 'red') + geom_text(aes(x = wmean+.03, label = round(wmean, 3), y = 500), color = 'red') + labs(y = 'Number of simulations', x = 'Weighted mean of percent of cells in dominant lineage', title = 'Cis') + xlim(0.15, 0.65) + ylim(0,850) + geom_text(aes(x = wmean+.03, label = 'Observed', y = 525), color = 'red') + theme_classic()

# Cis to DabTram
# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
wmean <- weighted.mean(unlist(lapply(cistodabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cistodabtram_lin_clust_list, function(x) sum(x$Num_cells))))
df <- data.frame(weighted_mean = sapply(1:length(cistodabtram_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cistodabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cistodabtram_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells))))))

ggplot(df, aes(x = weighted_mean))+geom_histogram(fill = '#A23622', color = 'black', binwidth = 0.005) + geom_vline(xintercept = wmean, linetype = 'dashed', color = 'red') + geom_text(aes(x = wmean+.03, label = round(wmean, 3), y = 500), color = 'red') + labs(y = 'Number of simulations', x = 'Weighted mean of percent of cells in dominant lineage', title = 'Cis to DabTram') + xlim(0.15, 0.65) + ylim(0,850) + geom_text(aes(x = wmean+.03, label = 'Observed', y = 525), color = 'red') + theme_classic()

# Cis to CoCl2
# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
wmean <- weighted.mean(unlist(lapply(cistococl2_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cistococl2_lin_clust_list, function(x) sum(x$Num_cells))))
df <- data.frame(weighted_mean = sapply(1:length(cistococl2_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cistococl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cistococl2_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells))))))

ggplot(df, aes(x = weighted_mean))+geom_histogram(fill = '#C96D29', color = 'black', binwidth = 0.005) + geom_vline(xintercept = wmean, linetype = 'dashed', color = 'red') + geom_text(aes(x = wmean+.03, label = round(wmean, 3), y = 500), color = 'red') + labs(y = 'Number of simulations', x = 'Weighted mean of percent of cells in dominant lineage', title = 'Cis to CoCl2') + xlim(0.15, 0.65) + ylim(0,850) + geom_text(aes(x = wmean+.03, label = 'Observed', y = 525), color = 'red') + theme_classic()

# Cis to Cis
# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
wmean <- weighted.mean(unlist(lapply(cistocis_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cistocis_lin_clust_list, function(x) sum(x$Num_cells))))
df <- data.frame(weighted_mean = sapply(1:length(cistocis_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cistocis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cistocis_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells))))))

ggplot(df, aes(x = weighted_mean))+geom_histogram(fill = '#FBD08C', color = 'black', binwidth = 0.005) + geom_vline(xintercept = wmean, linetype = 'dashed', color = 'red') + geom_text(aes(x = wmean+.03, label = round(wmean, 3), y = 500), color = 'red') + labs(y = 'Number of simulations', x = 'Weighted mean of percent of cells in dominant lineage', title = 'Cis to Cis') + xlim(0.15, 0.65) + ylim(0,850) + geom_text(aes(x = wmean+.03, label = 'Observed', y = 525), color = 'red') + theme_classic()
dev.off()
LS0tCnRpdGxlOiAiTGluZWFnZSBleHByZXNzaW9uIG92ZXIgdGltZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKI1NldCB3b3JraW5nIGRpcmVjdG9yeSB0byBhcHByb3ByaWF0ZSBmb2xkZXIgZm9yIGlucHV0cyBhbmQgb3V0cHV0cyBvbiBHb29nbGUgRHJpdmUKYGBge3IsIHNldHVwLCBpbmNsdWRlPUZBTFNFfQoja25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAnL1ZvbHVtZXMvR29vZ2xlRHJpdmUvTXkgRHJpdmUvRmFzc2VfU2hhcmVkL0FKRl9Ecml2ZV9jb3B5L0V4cGVyaW1lbnRzL0FKRjAwOScpICMgZm9yIGFyaWEncyBjb21wdXRlcgprbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICcvVm9sdW1lcy9Hb29nbGVEcml2ZS8uc2hvcnRjdXQtdGFyZ2V0cy1ieS1pZC8xelNxeDNJelhNd3Q2Y2xVand5cW1sT2Y0RzFLNTNsdnkvRmFzc2VfU2hhcmVkL0FKRl9Ecml2ZV9jb3B5L0V4cGVyaW1lbnRzL0FKRjAwOScpICMgZm9yIGR5bGFuJ3MgY29tcHV0ZXIKCiMyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vIGlzIGFkZGl0aW9uYWwgcGF0aCBmb3Igb3V0cHV0cwoKYGBgCgojSW5pdGlhbGl6ZQpgYGB7ciBpbmNsdWRlID0gRkFMU0V9CnJtKGxpc3QgPSBscygpKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkocGhlYXRtYXApCmxpYnJhcnkodmlyaWRpcykKCmAlbmluJWAgPSBOZWdhdGUoYCVpbiVgKQpgYGAKCiMgTG9hZCBkYXRhCmBgYHtyfQpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9Bc3NpZ25fZG9taW5hbnRfYmFyY29kZXMvYWxsX2RhdGFfZmluYWxfbGluZWFnZXMuUkRhdGEnKQpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9QcmVwcm9jZXNzX0dFWC9zZWNvbmRfdGltZXBvaW50X21lcmdlZC5SRGF0YScpCmxvYWQoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0ZpbHRlcmluZ19jRE5BL3Jlc2lzdGFudF9saW5lYWdlX2xpc3RzLlJEYXRhJykKCmxvYWQoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0Fzc2lnbl9kb21pbmFudF9iYXJjb2Rlcy9jaXNfZmluYWxfbGluZWFnZXMuUkRhdGEnKQpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9Bc3NpZ25fZG9taW5hbnRfYmFyY29kZXMvY29jbDJfZmluYWxfbGluZWFnZXMuUkRhdGEnKQpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9Bc3NpZ25fZG9taW5hbnRfYmFyY29kZXMvZGFidHJhbV9maW5hbF9saW5lYWdlcy5SRGF0YScpCmxvYWQoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0Fzc2lnbl9kb21pbmFudF9iYXJjb2Rlcy9kYWJ0cmFtX2JvdGhfdGltZXNfZmluYWxfbGluZWFnZXMuUkRhdGEnKQoKYGBgCgojUGxvdCBjZWxsIGN5Y2xlCmBgYHtyfQoKIyB2aWV3IGNlbGwgY3ljbGUgc2NvcmVzIGFuZCBwaGFzZSBhc3NpZ25tZW50cwpEaW1QbG90KGFsbF9kYXRhLCBncm91cC5ieSA9ICJQaGFzZSIpCkRpbVBsb3QoYWxsX2RhdGEpCkZlYXR1cmVQbG90KG9iamVjdCA9IGFsbF9kYXRhLCByZWR1Y3Rpb24gPSAndW1hcCcsIGZlYXR1cmVzID0gKCJuRmVhdHVyZV9STkEiKSwgcHQuc2l6ZSA9IDEsIGNvbWJpbmUgPSBULCBvcmRlciA9IFRSVUUpCkRpbVBsb3QoYWxsX2RhdGEsIGdyb3VwLmJ5ID0gIk9HX2NvbmRpdGlvbiIsIGNvbHMgPSBjKCdkYWJ0cmFtJyA9ICcjNjIzNTk0JywgJ2NvY2wyJyA9ICcjMEY4MjQxJywgJ2NpcycgPSAnI0M5NkQyOScsICdkYWJ0cmFtdG9kYWJ0cmFtJyA9ICcjNTYxRTU5JywgJ2RhYnRyYW10b2NvY2wyJyA9ICcjQTIyNDhFJywgJ2RhYnRyYW10b2NpcycgPSAnIzlEODVCRScsICdjb2NsMnRvZGFidHJhbScgPSAnIzEwNDEzQicsICdjb2NsMnRvY29jbDInID0gJyM2QUJENDUnLCAnY29jbDJ0b2NpcycgPSAnIzZEQzQ5QycsICdjaXN0b2RhYnRyYW0nID0gJyNBMjM2MjInLCAnY2lzdG9jb2NsMicgPSAnI0Y0OTEyOScsICdjaXN0b2NpcycgPSAnI0ZCRDA4QycpKQoKYGBgCgojIE1hcmtlcnMgd2l0aGluIGVhY2ggZmlyc3QgZHJ1ZyBvYmplY3QgdG8gZmluZCBzdWJncm91cHMgKGllIGFuYWxvZ291cyB0byBOR0ZSL0VHRlIpCmBgYHtyIGluY2x1ZGUgPSBGQUxTRX0KI2xvYWQoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9hbGxfZGF0YV9tYXJrZXJzLlJEYXRhJykKY2lzX21hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoY2lzLCBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1KQpjb2NsMl9tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGNvY2wyLCBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1KQpkYWJ0cmFtX21hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoZGFidHJhbSwgb25seS5wb3MgPSBUUlVFLCBtaW4ucGN0ID0gMC4yNSwgbG9nZmMudGhyZXNob2xkID0gMC4yNSkKCmFsbF9kYXRhLm1hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoYWxsX2RhdGEsIG9ubHkucG9zID0gVFJVRSwgbWluLnBjdCA9IDAuMjUsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMjUpIApzYXZlKGFsbF9kYXRhLm1hcmtlcnMsIGNpc19tYXJrZXJzLCBjb2NsMl9tYXJrZXJzLCBkYWJ0cmFtX21hcmtlcnMsIGZpbGUgPSAnYWxsX2RhdGFfbWFya2Vycy5SRGF0YScpCmBgYAoKIyBuZWVkIHRvIG1ha2UgSWRlbnRzIG1ldGFkYXRhIG9iamVjdCB3aGljaCBzYXlzIGlmIHRoZSBjZWxscyBhcmUgaW5jbHVkZWQgaW4gdGhlIGNvbWJpbmVkIGxpbnMgbGlzdCwgb3IgaWYgdGhleSB3ZXJlIGZpbHRlcmVkCmBgYHtyfQojZmluZCBsaW5lYWdlcyB0aGF0IGFyZSBtYWludGFpbmVkIGF0IGJvdGggZGFidHJhbSB0aW1lcG9pbnRzCmZpdmVjZWxsX2NETkEkRGFiVHJhbU1haW50YWluZWQgPC0gUmVkdWNlKGludGVyc2VjdCwgbGlzdChmaXZlY2VsbF9jRE5BJERhYlRyYW0sIGZpdmVjZWxsX2NETkEkRGFiVHJhbXRvRGFiVHJhbSkpCgpmaWx0ZXJlZF9tZXRhIDwtIHJlcCgwLCBsZW5ndGgobmFtZXMoYWxsX2RhdGEkTGluZWFnZSkpKQoKI3NwZWNpZnkgd2hpY2ggY2VsbHMgYXJlIGluIGxpbmVhZ2VzIHRoYXQgcGFzcyBmaWx0ZXJpbmcgZm9yIHRoYXQgY29uZGl0aW9uCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJkYWJ0cmFtIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBjb21iaW5lZF9saW5zX2xpc3QkRGFiVHJhbSldIDwtICdSZXNpc3RhbnQgdG8gRGFiVHJhbScKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW10b2RhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCREYWJUcmFtdG9EYWJUcmFtKV0gPC0gJ1Jlc2lzdGFudCB0byBEYWJUcmFtdG9EYWJUcmFtJwpmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiZGFidHJhbXRvY29jbDIiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCREYWJUcmFtdG9Db0NsMildIDwtICdSZXNpc3RhbnQgdG8gRGFiVHJhbXRvQ29DbDInCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJkYWJ0cmFtdG9jaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCREYWJUcmFtdG9DaXMpXSA8LSAnUmVzaXN0YW50IHRvIERhYlRyYW10b0NpcycKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wyIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBjb21iaW5lZF9saW5zX2xpc3QkQ29DbDIpXSA8LSAnUmVzaXN0YW50IHRvIENvQ2wyJwpmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiY29jbDJ0b2RhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDb0NsMnRvRGFiVHJhbSldIDwtICdSZXNpc3RhbnQgdG8gQ29DbDJ0b0RhYlRyYW0nCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjb2NsMnRvY29jbDIiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDb0NsMnRvQ29DbDIpXSA8LSAnUmVzaXN0YW50IHRvIENvQ2wydG9Db0NsMicKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wydG9jaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDb0NsMnRvQ2lzKV0gPC0gJ1Jlc2lzdGFudCB0byBDb0NsMnRvQ2lzJwpmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiY2lzIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBjb21iaW5lZF9saW5zX2xpc3QkQ2lzKV0gPC0gJ1Jlc2lzdGFudCB0byBDaXMnCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjaXN0b2RhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDaXN0b0RhYlRyYW0pXSA8LSAnUmVzaXN0YW50IHRvIENpc3RvRGFiVHJhbScKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpc3RvY29jbDIiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDaXN0b0NvQ2wyKV0gPC0gJ1Jlc2lzdGFudCB0byBDaXN0b0NvQ2wyJwpmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiY2lzdG9jaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDaXN0b0NpcyldIDwtICdSZXNpc3RhbnQgdG8gQ2lzdG9DaXMnCgojc3BlY2lmeSB3aGljaCBjZWxscyBhcmUgaW4gbGluZWFnZXMgb2YgbW9yZSB0aGFuIDUgY2VsbHMKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGZpdmVjZWxsX2NETkEkRGFiVHJhbSldIDwtICdMYXJnZSBSZXNpc3RhbnQgdG8gRGFiVHJhbScKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW10b2RhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGZpdmVjZWxsX2NETkEkRGFiVHJhbXRvRGFiVHJhbSldIDwtICdMYXJnZSBSZXNpc3RhbnQgdG8gRGFiVHJhbXRvRGFiVHJhbScKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW10b2NvY2wyIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBmaXZlY2VsbF9jRE5BJERhYlRyYW10b0NvQ2wyKV0gPC0gJ0xhcmdlIFJlc2lzdGFudCB0byBEYWJUcmFtdG9Db0NsMicKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW10b2NpcyIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgZml2ZWNlbGxfY0ROQSREYWJUcmFtdG9DaXMpXSA8LSAnTGFyZ2UgUmVzaXN0YW50IHRvIERhYlRyYW10b0NpcycKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wyIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBmaXZlY2VsbF9jRE5BJENvQ2wyKV0gPC0gJ0xhcmdlIFJlc2lzdGFudCB0byBDb0NsMicKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wydG9kYWJ0cmFtIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBmaXZlY2VsbF9jRE5BJENvQ2wydG9EYWJUcmFtKV0gPC0gJ0xhcmdlIFJlc2lzdGFudCB0byBDb0NsMnRvRGFiVHJhbScKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wydG9jb2NsMiIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgZml2ZWNlbGxfY0ROQSRDb0NsMnRvQ29DbDIpXSA8LSAnTGFyZ2UgUmVzaXN0YW50IHRvIENvQ2wydG9Db0NsMicKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wydG9jaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGZpdmVjZWxsX2NETkEkQ29DbDJ0b0NpcyldIDwtICdMYXJnZSBSZXNpc3RhbnQgdG8gQ29DbDJ0b0NpcycKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpcyIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgZml2ZWNlbGxfY0ROQSRDaXMpXSA8LSAnTGFyZ2UgUmVzaXN0YW50IHRvIENpcycKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpc3RvZGFidHJhbSIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgZml2ZWNlbGxfY0ROQSRDaXN0b0RhYlRyYW0pXSA8LSAnTGFyZ2UgUmVzaXN0YW50IHRvIENpc3RvRGFiVHJhbScKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpc3RvY29jbDIiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGZpdmVjZWxsX2NETkEkQ2lzdG9Db0NsMildIDwtICdMYXJnZSBSZXNpc3RhbnQgdG8gQ2lzdG9Db0NsMicKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpc3RvY2lzIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBmaXZlY2VsbF9jRE5BJENpc3RvQ2lzKV0gPC0gJ0xhcmdlIFJlc2lzdGFudCB0byBDaXN0b0NpcycKCiMgZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGZpdmVjZWxsX2NETkEkRGFiVHJhbU1haW50YWluZWQpXSA8LSAnTWFpbnRhaW5lZCBSZXNpc3RhbnQgdG8gRGFiVHJhbScKIyBmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiZGFidHJhbXRvZGFidHJhbSIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgZml2ZWNlbGxfY0ROQSREYWJUcmFtTWFpbnRhaW5lZCldIDwtICdNYWludGFpbmVkIFJlc2lzdGFudCB0byBEYWJUcmFtdG9EYWJUcmFtJwoKI3NwZWNpZnkgd2hpY2ggY2VsbHMgYXJlIGluIGxpbmVhZ2VzIHRoYXQgZGlkIG5vdCBwYXNzIGZpbHRlcmluZwpmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiZGFidHJhbSIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCREYWJUcmFtICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjKCJObyBCYXJjb2RlIiwgIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnRmlsdGVyZWQgb3V0JyAKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW10b2RhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjb21iaW5lZF9saW5zX2xpc3QkRGFiVHJhbXRvRGFiVHJhbSAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgYygiTm8gQmFyY29kZSIsICJTdGlsbCBtdWx0aXBsZSIpKV0gPC0gJ0ZpbHRlcmVkIG91dCcgCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJkYWJ0cmFtdG9jb2NsMiIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCREYWJUcmFtdG9Db0NsMiAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgYygiTm8gQmFyY29kZSIsICJTdGlsbCBtdWx0aXBsZSIpKV0gPC0gJ0ZpbHRlcmVkIG91dCcgCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJkYWJ0cmFtdG9jaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjb21iaW5lZF9saW5zX2xpc3QkRGFiVHJhbXRvQ2lzICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjKCJObyBCYXJjb2RlIiwgIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnRmlsdGVyZWQgb3V0JyAKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wyIiAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgY29tYmluZWRfbGluc19saXN0JENvQ2wyICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjKCJObyBCYXJjb2RlIiwgIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnRmlsdGVyZWQgb3V0JyAKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wydG9kYWJ0cmFtIiAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgY29tYmluZWRfbGluc19saXN0JENvQ2wydG9EYWJUcmFtICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjKCJObyBCYXJjb2RlIiwgIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnRmlsdGVyZWQgb3V0JyAKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wydG9jb2NsMiIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDb0NsMnRvQ29DbDIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGMoIk5vIEJhcmNvZGUiLCAiU3RpbGwgbXVsdGlwbGUiKSldIDwtICdGaWx0ZXJlZCBvdXQnIApmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiY29jbDJ0b2NpcyIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDb0NsMnRvQ2lzICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjKCJObyBCYXJjb2RlIiwgIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnRmlsdGVyZWQgb3V0JyAKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpcyIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDaXMgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGMoIk5vIEJhcmNvZGUiLCAiU3RpbGwgbXVsdGlwbGUiKSldIDwtICdGaWx0ZXJlZCBvdXQnIApmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiY2lzdG9kYWJ0cmFtIiAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgY29tYmluZWRfbGluc19saXN0JENpc3RvRGFiVHJhbSAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgYygiTm8gQmFyY29kZSIsICJTdGlsbCBtdWx0aXBsZSIpKV0gPC0gJ0ZpbHRlcmVkIG91dCcgCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjaXN0b2NvY2wyIiAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgY29tYmluZWRfbGluc19saXN0JENpc3RvQ29DbDIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGMoIk5vIEJhcmNvZGUiLCAiU3RpbGwgbXVsdGlwbGUiKSldIDwtICdGaWx0ZXJlZCBvdXQnIApmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiY2lzdG9jaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjb21iaW5lZF9saW5zX2xpc3QkQ2lzdG9DaXMgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGMoIk5vIEJhcmNvZGUiLCAiU3RpbGwgbXVsdGlwbGUiKSldIDwtICdGaWx0ZXJlZCBvdXQnIAoKI3NwZWNpZnkgd2hpY2ggY2VsbHMgaGFkIHplcm8gb3IgbXVsdGlwbGUgYmFyY29kZXMKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRMaW5lYWdlICVpbiUgYygiTm8gQmFyY29kZSIsICJTdGlsbCBtdWx0aXBsZSIpKV0gPC0gJ05vIEJhcmNvZGUnCgpwcmludCh0YWJsZShmaWx0ZXJlZF9tZXRhKSkKCmBgYAoKYGBge3J9CmFsbF9kYXRhJFJlc2lzdGFudF9maWx0ZXJlZCA8LSBmaWx0ZXJlZF9tZXRhCklkZW50cyhhbGxfZGF0YSkgPC0gYWxsX2RhdGEkUmVzaXN0YW50X2ZpbHRlcmVkCmBgYAoKYGBge3J9CnBkZignMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL3Rlc3RfcGxvdC5wZGYnLCBoZWlnaHQgPSAxMCwgd2lkdGggPSAyMCkKRGltUGxvdChhbGxfZGF0YSwgZ3JvdXAuYnkgPSAnaWRlbnQnLCBjb2xzID0gKQpEaW1QbG90KGFsbF9kYXRhLCBncm91cC5ieSA9ICJMaW5lYWdlIikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpCmRldi5vZmYoKQoKYGBgCgpgYGB7cn0KcGRmKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vdGVzdF92aW9saW4ucGRmJywgaGVpZ2h0ID0gMTAsIHdpZHRoID0gMzApCgpWbG5QbG90KGFsbF9kYXRhLCBmZWF0dXJlcyA9ICdOR0ZSJywgaWRlbnRzID0gJ01haW50YWluZWQgUmVzaXN0YW50IHRvIERhYlRyYW0nLCBncm91cC5ieSA9ICJMaW5lYWdlIikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsgZ2VvbV9ib3hwbG90KGZpbGwgPSAnd2hpdGUnLCB3aWR0aCA9IDAuMSkKVmxuUGxvdChhbGxfZGF0YSwgZmVhdHVyZXMgPSAnRUdGUicsIGlkZW50cyA9ICdNYWludGFpbmVkIFJlc2lzdGFudCB0byBEYWJUcmFtJywgZ3JvdXAuYnkgPSAiTGluZWFnZSIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArIGdlb21fYm94cGxvdChmaWxsID0gJ3doaXRlJywgd2lkdGggPSAwLjEpClZsblBsb3QoYWxsX2RhdGEsIGZlYXR1cmVzID0gJ05HRlInLCBpZGVudHMgPSAnTWFpbnRhaW5lZCBSZXNpc3RhbnQgdG8gRGFiVHJhbXRvRGFiVHJhbScsIGdyb3VwLmJ5ID0gIkxpbmVhZ2UiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKyBnZW9tX2JveHBsb3QoZmlsbCA9ICd3aGl0ZScsIHdpZHRoID0gMC4xKQpWbG5QbG90KGFsbF9kYXRhLCBmZWF0dXJlcyA9ICdFR0ZSJywgaWRlbnRzID0gJ01haW50YWluZWQgUmVzaXN0YW50IHRvIERhYlRyYW10b0RhYlRyYW0nLCBncm91cC5ieSA9ICJMaW5lYWdlIikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsgZ2VvbV9ib3hwbG90KGZpbGwgPSAnd2hpdGUnLCB3aWR0aCA9IDAuMSkKClZsblBsb3QoYWxsX2RhdGEsIGZlYXR1cmVzID0gJ05HRlInLCBpZGVudHMgPSAnTGFyZ2UgUmVzaXN0YW50IHRvIERhYlRyYW0nLCBncm91cC5ieSA9ICJMaW5lYWdlIikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsgZ2VvbV9ib3hwbG90KGZpbGwgPSAnd2hpdGUnLCB3aWR0aCA9IDAuMSkKVmxuUGxvdChhbGxfZGF0YSwgZmVhdHVyZXMgPSAnRUdGUicsIGlkZW50cyA9ICdMYXJnZSBSZXNpc3RhbnQgdG8gRGFiVHJhbScsIGdyb3VwLmJ5ID0gIkxpbmVhZ2UiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKyBnZW9tX2JveHBsb3QoZmlsbCA9ICd3aGl0ZScsIHdpZHRoID0gMC4xKQpWbG5QbG90KGFsbF9kYXRhLCBmZWF0dXJlcyA9ICdOR0ZSJywgaWRlbnRzID0gJ0xhcmdlIFJlc2lzdGFudCB0byBEYWJUcmFtdG9EYWJUcmFtJywgZ3JvdXAuYnkgPSAiTGluZWFnZSIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArIGdlb21fYm94cGxvdChmaWxsID0gJ3doaXRlJywgd2lkdGggPSAwLjEpClZsblBsb3QoYWxsX2RhdGEsIGZlYXR1cmVzID0gJ0VHRlInLCBpZGVudHMgPSAnTGFyZ2UgUmVzaXN0YW50IHRvIERhYlRyYW10b0RhYlRyYW0nLCBncm91cC5ieSA9ICJMaW5lYWdlIikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsgZ2VvbV9ib3hwbG90KGZpbGwgPSAnd2hpdGUnLCB3aWR0aCA9IDAuMSkKCmRldi5vZmYoKQojVmxuUGxvdChhbGxfZGF0YSwgZmVhdHVyZXMgPSAnTkdGUicsIGlkZW50cyA9IGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAnZGFidHJhbScsIGdyb3VwLmJ5ID0gImxpbmVhZ2UiKQpgYGAKCiNMb29raW5nIGludG8gdGhlIG9uZSBsaW5lYWdlIHRoYXQgc3dpdGNoZXMgbmdmciAtPiBlZ2ZyCmBgYHtyfQoKc3dpdGNoX2xpbl9kYWJ0cmFtIDwtIG5hbWVzKGFsbF9kYXRhJG9yaWcuaWRlbnRbYWxsX2RhdGEkTGluZWFnZSA9PSAiTGluMTcxNTE2IiAmIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAnZGFidHJhbSddKQpzd2l0Y2hfbGluX2RhYnRyYW10b2RhYnRyYW0gPC0gbmFtZXMoYWxsX2RhdGEkb3JpZy5pZGVudFthbGxfZGF0YSRMaW5lYWdlID09ICJMaW4xNzE1MTYiICYgYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICdkYWJ0cmFtdG9kYWJ0cmFtJ10pCgpEaW1QbG90KGFsbF9kYXRhLCBncm91cC5ieSA9ICJPR19jb25kaXRpb24iLCBjb2xzID0gYygnZGFidHJhbScgPSAnIzYyMzU5NCcsICdjb2NsMicgPSAnIzBGODI0MScsICdjaXMnID0gJyNDOTZEMjknLCAnZGFidHJhbXRvZGFidHJhbScgPSAnIzU2MUU1OScsICdkYWJ0cmFtdG9jb2NsMicgPSAnI0EyMjQ4RScsICdkYWJ0cmFtdG9jaXMnID0gJyM5RDg1QkUnLCAnY29jbDJ0b2RhYnRyYW0nID0gJyMxMDQxM0InLCAnY29jbDJ0b2NvY2wyJyA9ICcjNkFCRDQ1JywgJ2NvY2wydG9jaXMnID0gJyM2REM0OUMnLCAnY2lzdG9kYWJ0cmFtJyA9ICcjQTIzNjIyJywgJ2Npc3RvY29jbDInID0gJyNGNDkxMjknLCAnY2lzdG9jaXMnID0gJyNGQkQwOEMnKSkKRGltUGxvdChhbGxfZGF0YSwgY2VsbHMuaGlnaGxpZ2h0ID0gbGlzdChzd2l0Y2hfbGluX2RhYnRyYW0pLCBjb2xzLmhpZ2hsaWdodCA9IGMoJ3JlZCcpKQpEaW1QbG90KGFsbF9kYXRhLCBjZWxscy5oaWdobGlnaHQgPSBsaXN0KHN3aXRjaF9saW5fZGFidHJhbSwgc3dpdGNoX2xpbl9kYWJ0cmFtdG9kYWJ0cmFtKSwgY29scy5oaWdobGlnaHQgPSBjKCdibHVlJywgJ3JlZCcpKQoKc3dpdGNoX2xpbiA8LSBuYW1lcyhkYWJ0cmFtJG9yaWcuaWRlbnRbZGFidHJhbSRMaW5lYWdlID09ICJMaW4xNzE1MTYiXSkKRGltUGxvdChkYWJ0cmFtKQpEaW1QbG90KGRhYnRyYW0sIGNlbGxzLmhpZ2hsaWdodCA9IGxpc3Qoc3dpdGNoX2xpbikpCgpgYGAKCiNmcm9tIGRhYnRyYW1fYm90aF90aW1lcywgZm9yY2UgMiBjbHVzdGVycyBpbiB1bWFwLCBwbG90IHZzIG5nZnIgZWdmciwgZmluZCBtYXJrZXJzIG9mIHRoZXNlIDIKYGBge3J9CgpkYWJ0cmFtX2JvdGhfdGltZXNfbWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhkYWJ0cmFtX2JvdGhfdGltZXMsIG9ubHkucG9zID0gVFJVRSwgbWluLnBjdCA9IDAuMjUsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMjUpCkRpbVBsb3QoZGFidHJhbV9ib3RoX3RpbWVzKQpEaW1QbG90KGRhYnRyYW1fYm90aF90aW1lcywgZ3JvdXAuYnkgPSAnT0dfY29uZGl0aW9uJykKRmVhdHVyZVBsb3QoZGFidHJhbV9ib3RoX3RpbWVzLCBmZWF0dXJlcyA9IGMoJ05HRlInLCAnRUdGUicsICduRmVhdHVyZV9STkEnKSkKYGBgCgojQXNzaWduIGNsdXN0ZXIgYXNzaWdubWVudHMgcGVyIGxpbmVhZ2UsIGZpbmQgYXZlcmFnZSBzY29yZSBwZXIgbGluZWFnZSAtIG1ha2UgcGxvdHMgaW4gb3JkZXIKYGBge3J9CiNhdmVyYWdlIGNlbGwgYXNzaWdubWVudHMgcGVyIGxpbmVhZ2UgaW4gZGFidHJhbV9tYWludGFpbmVkCgojd2FudCB0byBkbyBhIHN0YWNrZWQgYmFycGxvdCBoZXJlLS0gY29weSBwYXN0ZSBjb2RlIGZyb20gY29uZGl0aW9uIGNsdXN0ZXJpbmcKCiNnZXQgbGluZWFnZSBhbmQgY2x1c3RlciBkYXRhIGZyb20gc2V1cmF0IG9iamVjdCwgc3dpdGNoIGNsdXN0ZXIgaWRlbnRpZmllcnMgZnJvbSAwLDEgdG8gLTEsMSAoZWdmciwgbmdmcikKY2x1c3RlcnNfcGVyX2xpbiA8LSBkYXRhLmZyYW1lIChDbHVzdGVyID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGFidHJhbV9ib3RoX3RpbWVzJHNldXJhdF9jbHVzdGVycykpLCBMaW5lYWdlID0gZGFidHJhbV9ib3RoX3RpbWVzJExpbmVhZ2UsIGNvbmRpdGlvbiA9IGRhYnRyYW1fYm90aF90aW1lcyRPR19jb25kaXRpb24pCmNsdXN0ZXJzX3Blcl9saW4kQ2x1c3RlcltjbHVzdGVyc19wZXJfbGluJENsdXN0ZXIgPT0gMF0gPC0gLTEKY2x1c3RlcnNfcGVyX2xpbl9saXN0IDwtIGxpc3QoKQoKIyBOZWVkIHRvIGdldCBwZXJjZW50IHZhbHVlcyBvZiBFR0ZSIGZvciB0aGUgbGluZWFnZSBhZnRlciB0aGUgZmlyc3QgdHJlYXRtZW50CmZvciAoaSBpbiBmaXZlY2VsbF9jRE5BJERhYlRyYW0pewogIGN1cnJlbnRsaW4gPC0gZmlsdGVyKGNsdXN0ZXJzX3Blcl9saW4sIGNsdXN0ZXJzX3Blcl9saW4kTGluZWFnZSA9PSBpICYgY2x1c3RlcnNfcGVyX2xpbiRjb25kaXRpb24gPT0gJ2RhYnRyYW0nKQogIFZhcjEgPC0gYygtMSwxKQogIEZyZXEgPC0gYyhzdW0oZmlsdGVyKGNsdXN0ZXJzX3Blcl9saW4sIGNsdXN0ZXJzX3Blcl9saW4kTGluZWFnZSA9PSBpICYgY2x1c3RlcnNfcGVyX2xpbiRjb25kaXRpb24gPT0gJ2RhYnRyYW0nKSRDbHVzdGVyID09IC0xKSwgIyBFR0ZSCiAgc3VtKGZpbHRlcihjbHVzdGVyc19wZXJfbGluLCBjbHVzdGVyc19wZXJfbGluJExpbmVhZ2UgPT0gaSAmIGNsdXN0ZXJzX3Blcl9saW4kY29uZGl0aW9uID09ICdkYWJ0cmFtJykkQ2x1c3RlciA9PSAxKSkKICBjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSA8LSBkYXRhLmZyYW1lKCdWYXIxJyA9IFZhcjEsICdGcmVxJyA9IEZyZXEpCiAgY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0kU2NvcmUgPC0gd2VpZ2h0ZWQubWVhbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSRWYXIxKSksIGNsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJEZyZXEpCn0KCiMgQnVpbGQgYSBkYXRhZnJhbWUgZm9yIHBsb3R0aW5nIGJhc2VkIG9uICUgRUdGUiBvciBOR0ZSIHBlciBsaW5lYWdlIGFmdGVyIGZpcnN0IHRyZWF0bWVudApjbHVzdGVyc19wZXJfbGluX2RmIDwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSA1LCBucm93ID0gMCkpCmNvbG5hbWVzKGNsdXN0ZXJzX3Blcl9saW5fZGYpIDwtIGMoJ0xpbmVhZ2UnLCAnUGVyY2VudF9jZWxscycsICdOdW1fY2VsbHMnLCAnU2NvcmUnKQpmb3IgKGkgaW4gbmFtZXMoY2x1c3RlcnNfcGVyX2xpbl9saXN0KSl7CiAgICBjbHVzdGVyc19wZXJfbGluX2RmIDwtIHJiaW5kKGNsdXN0ZXJzX3Blcl9saW5fZGYsIGRhdGEuZnJhbWUoJ0xpbmVhZ2UnID0gaSwgJ1BlcmNlbnRfY2VsbHMnID0gY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0kRnJlcVtjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSRWYXIxID09IDFdL3N1bShjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSRGcmVxKSwgJ051bV9jZWxscycgPSBzdW0oY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0kRnJlcVtjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSRWYXIxID09IDFdKSwgJ1Njb3JlJyA9IGNsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJFNjb3JlWzFdLCAnQ2x1c3RlcicgPSAnTkdGUicpKSAjIEFkZCBOR0ZSIHJvdwogIGNsdXN0ZXJzX3Blcl9saW5fZGYgPC0gcmJpbmQoY2x1c3RlcnNfcGVyX2xpbl9kZiwgZGF0YS5mcmFtZSgnTGluZWFnZScgPSBpLCAnUGVyY2VudF9jZWxscycgPSBjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSRGcmVxW2NsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJFZhcjEgPT0gLTFdL3N1bShjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSRGcmVxKSwgJ051bV9jZWxscycgPSBzdW0oY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0kRnJlcVtjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSRWYXIxID09IC0xXSksICdTY29yZScgPSBjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSRTY29yZVsxXSwgJ0NsdXN0ZXInID0gJ0VHRlInKSkgIyBBZGQgRUdGUiByb3cKfQoKIyBSZW9yZGVyIHNvIHRoYXQgRUdGUiBkb21pbmFudCBsaW5lYWdlcyBhcmUgcGxvdCBmaXJzdApjbHVzdGVyc19wZXJfbGluX2RmIDwtIGNsdXN0ZXJzX3Blcl9saW5fZGZbd2l0aChjbHVzdGVyc19wZXJfbGluX2RmLCBvcmRlcigtU2NvcmUsTnVtX2NlbGxzICkpLF0KY2x1c3RlcnNfcGVyX2xpbl9kZiRMaW5lYWdlIDwtIGZhY3RvcihjbHVzdGVyc19wZXJfbGluX2RmJExpbmVhZ2UsIGxldmVscyA9IHJldih1bmlxdWUoY2x1c3RlcnNfcGVyX2xpbl9kZiRMaW5lYWdlKSkpCgojIG1ha2UgbGlzdCBvYmplY3QgZm9yIGFmdGVyIHNlY29uZCB0cmVhdG1lbnQKY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlYyA8LSBsaXN0KCkKCiMgTmVlZCB0byBnZXQgcGVyY2VudCB2YWx1ZXMgb2YgRUdGUiBmb3IgdGhlIGxpbmVhZ2UgYWZ0ZXIgdGhlIHNlY29uZCB0cmVhdG1lbnQKZm9yIChpIGluIGZpdmVjZWxsX2NETkEkRGFiVHJhbSl7CiAgY3VycmVudGxpbiA8LSBmaWx0ZXIoY2x1c3RlcnNfcGVyX2xpbiwgY2x1c3RlcnNfcGVyX2xpbiRMaW5lYWdlID09IGkgJiBjbHVzdGVyc19wZXJfbGluJGNvbmRpdGlvbiA9PSAnZGFidHJhbXRvZGFidHJhbScpCiAgVmFyMSA8LSBjKC0xLDEpCiAgRnJlcSA8LSBjKHN1bShmaWx0ZXIoY2x1c3RlcnNfcGVyX2xpbiwgY2x1c3RlcnNfcGVyX2xpbiRMaW5lYWdlID09IGkgJiBjbHVzdGVyc19wZXJfbGluJGNvbmRpdGlvbiA9PSAnZGFidHJhbXRvZGFidHJhbScpJENsdXN0ZXIgPT0gLTEpLCAjIEVHRlIKICBzdW0oZmlsdGVyKGNsdXN0ZXJzX3Blcl9saW4sIGNsdXN0ZXJzX3Blcl9saW4kTGluZWFnZSA9PSBpICYgY2x1c3RlcnNfcGVyX2xpbiRjb25kaXRpb24gPT0gJ2RhYnRyYW10b2RhYnRyYW0nKSRDbHVzdGVyID09IDEpKQogIGNsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSA8LSBkYXRhLmZyYW1lKCdWYXIxJyA9IFZhcjEsICdGcmVxJyA9IEZyZXEpCiAgY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJFNjb3JlIDwtIHdlaWdodGVkLm1lYW4oYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJFZhcjEpKSwgY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJEZyZXEpCn0KCiMgQnVpbGQgYSBkYXRhZnJhbWUgZm9yIHBsb3R0aW5nIGJhc2VkIG9uICUgRUdGUiBvciBOR0ZSIHBlciBsaW5lYWdlIGFmdGVyIHNlY29uZCB0cmVhdG1lbnQKY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IDUsIG5yb3cgPSAwKSkKY29sbmFtZXMoY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMpIDwtIGMoJ0xpbmVhZ2UnLCAnUGVyY2VudF9jZWxscycsICdOdW1fY2VsbHMnLCAnU2NvcmUnLCAnQ2x1c3RlcicpCmZvciAoaSBpbiBuYW1lcyhjbHVzdGVyc19wZXJfbGluX2xpc3QpKXsKCiAgaWYgKHN1bShjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kRnJlcSkgPCA1KXsKICAgIGNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjIDwtIHJiaW5kKGNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjLCBkYXRhLmZyYW1lKCdMaW5lYWdlJyA9IGksICdQZXJjZW50X2NlbGxzJyA9IDEsICdOdW1fY2VsbHMnID0gMCwgJ1Njb3JlJyA9IDAsICdDbHVzdGVyJyA9ICdEaWVkJykpICMgQWRkIExpbmVhZ2UgZGllZCByb3cKICAgIGNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjIDwtIHJiaW5kKGNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjLCBkYXRhLmZyYW1lKCdMaW5lYWdlJyA9IGksICdQZXJjZW50X2NlbGxzJyA9IDAsICdOdW1fY2VsbHMnID0gMCwgJ1Njb3JlJyA9IDAsICdDbHVzdGVyJyA9ICdOR0ZSJykpICMgQWRkIE5HRlIgcm93CiAgICBjbHVzdGVyc19wZXJfbGluX2RmX3NlYyA8LSByYmluZChjbHVzdGVyc19wZXJfbGluX2RmX3NlYywgZGF0YS5mcmFtZSgnTGluZWFnZScgPSBpLCAnUGVyY2VudF9jZWxscycgPSAwLCAnTnVtX2NlbGxzJyA9IDAsICdTY29yZScgPSAwLCAnQ2x1c3RlcicgPSAnRUdGUicpKSAjIEFkZCBFR0ZSIHJvdwogIH1lbHNleyAjIEFjdHVhbGx5IGNhbGN1bGF0ZSBwZXJjZW50YWdlcyBzaW5jZSB0aGUgbGluZWFnZSBzdXJ2aXZlZC9pcyBtb3JlIHRoYW4gNSBjZWxscwogICAgICBjbHVzdGVyc19wZXJfbGluX2RmX3NlYyA8LSByYmluZChjbHVzdGVyc19wZXJfbGluX2RmX3NlYywgZGF0YS5mcmFtZSgnTGluZWFnZScgPSBpLCAnUGVyY2VudF9jZWxscycgPSAwLCAnTnVtX2NlbGxzJyA9IDAsICdTY29yZScgPSBjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kU2NvcmVbMV0sICdDbHVzdGVyJyA9ICdEaWVkJykpICMgQWRkIExpbmVhZ2UgZGllZCByb3cKICAgICAgY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMgPC0gcmJpbmQoY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMsIGRhdGEuZnJhbWUoJ0xpbmVhZ2UnID0gaSwgJ1BlcmNlbnRfY2VsbHMnID0gY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJEZyZXFbY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJFZhcjEgPT0gMV0vc3VtKGNsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRGcmVxKSwgJ051bV9jZWxscycgPSBzdW0oY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJEZyZXFbY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJFZhcjEgPT0gMV0pLCAnU2NvcmUnID0gY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJFNjb3JlWzFdLCAnQ2x1c3RlcicgPSAnTkdGUicpKSAjIEFkZCBOR0ZSIHJvdwogICAgICBjbHVzdGVyc19wZXJfbGluX2RmX3NlYyA8LSByYmluZChjbHVzdGVyc19wZXJfbGluX2RmX3NlYywgZGF0YS5mcmFtZSgnTGluZWFnZScgPSBpLCAnUGVyY2VudF9jZWxscycgPSBjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kRnJlcVtjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kVmFyMSA9PSAtMV0vc3VtKGNsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRGcmVxKSwgJ051bV9jZWxscycgPSBzdW0oY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJEZyZXFbY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJFZhcjEgPT0gLTFdKSwgJ1Njb3JlJyA9IGNsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRTY29yZVsxXSwgJ0NsdXN0ZXInID0gJ0VHRlInKSkgIyBBZGQgRUdGUiByb3cKICAgIH0KfQoKIyBSZW9yZGVyIHNvIHRoYXQgRUdGUiBkb21pbmFudCBsaW5lYWdlcyBhcmUgcGxvdCBmaXJzdApjbHVzdGVyc19wZXJfbGluX2RmX3NlYyRMaW5lYWdlIDwtIGZhY3RvcihjbHVzdGVyc19wZXJfbGluX2RmX3NlYyRMaW5lYWdlLCBsZXZlbHMgPSByZXYodW5pcXVlKGNsdXN0ZXJzX3Blcl9saW5fZGYkTGluZWFnZSkpKQoKIyBQbG90CnAxIDwtIGdncGxvdChjbHVzdGVyc19wZXJfbGluX2RmLCBhZXMoeSA9IFBlcmNlbnRfY2VsbHMsIHggPSBMaW5lYWdlLCBmaWxsID0gQ2x1c3RlcikpICsgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScsIHBvc2l0aW9uID0gcG9zaXRpb25fZmlsbChyZXZlcnNlID0gVCksIGNvbG9yID0gJyNEM0QzRDMnKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiMwMDAwMDAiLCIjRkZGRkZGIikpICsgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQpwMiA8LSBnZ3Bsb3QoY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMsIGFlcyh5ID0gUGVyY2VudF9jZWxscywgeCA9IExpbmVhZ2UsIGZpbGwgPSBDbHVzdGVyKSkgKyBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JywgcG9zaXRpb24gPSBwb3NpdGlvbl9maWxsKHJldmVyc2UgPSBUKSwgY29sb3IgPSAnI0QzRDNEMycpICsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI0ZGMDAwMCIsIiMwMDAwMDAiLCAnI0ZGRkZGRicpKSArIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCnBkZignMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL3N0YWNrZWRfYmFyX0VHRlJfTkdGUl9EaWVkLnBkZicpCmdnYXJyYW5nZShwMSxwMiwgbnJvdyA9IDIpCmRldi5vZmYoKQpgYGAKCiMgUGxvdCB0aGUgbnVtYmVyIG9mIGNlbGxzIHBlciBsaW5lYWdlIGluIHNlY29uZCBkcnVnIGZvciBsaW5lYWdlcyB0aGF0IHN1cnZpdmVkIGluIERhYlRyYW0KYGBge3J9CiMgR2V0IHRoZSBudW1iZXIgb2YgY2VsbHMgaW4gdGhlIERhYlRyYW0gcmVzaXN0YW50IGxpbmVhZ2VzIGluIHRoZSBjb25kaXRpb25zIHRoYXQgZ290IERhYlRyYW0gZmlyc3QKZGFidHJhbXRvY29jbDJfZHRfcmVzaXN0X2xpbnMgPC0gbGlzdCgpCmRhYnRyYW10b2Npc19kdF9yZXNpc3RfbGlucyA8LSBsaXN0KCkKCmZvciAoaSBpbiBmaXZlY2VsbF9jRE5BJERhYlRyYW0pewogIGRhYnRyYW10b2NvY2wyX2R0X3Jlc2lzdF9saW5zW1tpXV0gPC0gYWxsX2RhdGEkTGluZWFnZVthbGxfZGF0YSRMaW5lYWdlID09IGkgJiBhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gJ2RhYnRyYW10b2NvY2wyJ10KICBkYWJ0cmFtdG9jaXNfZHRfcmVzaXN0X2xpbnNbW2ldXSA8LSBhbGxfZGF0YSRMaW5lYWdlW2FsbF9kYXRhJExpbmVhZ2UgPT0gaSAmIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAnZGFidHJhbXRvY2lzJ10KfQoKIyBjb252ZXJ0IGxpc3QgdG8gZGF0YWZyYW1lCmRhYnRyYW10b2NvY2wyX2R0X3Jlc2lzdF9saW5zX2RmIDwtIGRhdGEuZnJhbWUobnVtX2NlbGxzID0gbGVuZ3RocyhkYWJ0cmFtdG9jb2NsMl9kdF9yZXNpc3RfbGlucykpCmRhYnRyYW10b2NvY2wyX2R0X3Jlc2lzdF9saW5zX2RmJExpbmVhZ2UgPSByb3duYW1lcyhkYWJ0cmFtdG9jb2NsMl9kdF9yZXNpc3RfbGluc19kZikKZGFidHJhbXRvY29jbDJfZHRfcmVzaXN0X2xpbnNfZGYkTGluZWFnZSA8LSBmYWN0b3IoZGFidHJhbXRvY29jbDJfZHRfcmVzaXN0X2xpbnNfZGYkTGluZWFnZSwgbGV2ZWxzID0gcmV2KHVuaXF1ZShjbHVzdGVyc19wZXJfbGluX2RmJExpbmVhZ2UpKSkKCmRhYnRyYW10b2Npc19kdF9yZXNpc3RfbGluc19kZiA8LSBkYXRhLmZyYW1lKG51bV9jZWxscyA9IGxlbmd0aHMoZGFidHJhbXRvY2lzX2R0X3Jlc2lzdF9saW5zKSkKZGFidHJhbXRvY2lzX2R0X3Jlc2lzdF9saW5zX2RmJExpbmVhZ2UgPSByb3duYW1lcyhkYWJ0cmFtdG9jaXNfZHRfcmVzaXN0X2xpbnNfZGYpCmRhYnRyYW10b2Npc19kdF9yZXNpc3RfbGluc19kZiRMaW5lYWdlIDwtIGZhY3RvcihkYWJ0cmFtdG9jaXNfZHRfcmVzaXN0X2xpbnNfZGYkTGluZWFnZSwgbGV2ZWxzID0gcmV2KHVuaXF1ZShjbHVzdGVyc19wZXJfbGluX2RmJExpbmVhZ2UpKSkKCiMgUGxvdCAKcDMgPC0gZ2dwbG90KGRhYnRyYW10b2NvY2wyX2R0X3Jlc2lzdF9saW5zX2RmLCBhZXMoeSA9IGxvZyhudW1fY2VsbHMrMSksIHggPSBMaW5lYWdlKSkgKyBnZW9tX2NvbChmaWxsID0gJyNBMjI0OEUnKSArIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkgKyBsYWJzKHRpdGxlID0gJ0RhYlRyYW0gdG8gQ29DbDInKQoKcDQgPC0gZ2dwbG90KGRhYnRyYW10b2Npc19kdF9yZXNpc3RfbGluc19kZiwgYWVzKHkgPSBsb2cobnVtX2NlbGxzKzEpLCB4ID0gTGluZWFnZSkpICsgZ2VvbV9jb2woZmlsbCA9ICcjOUQ4NUJFJykgKyB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpICsgbGFicyh0aXRsZSA9ICdEYWJUcmFtIHRvIENpcycpIAoKcGRmKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vc3RhY2tlZF9iYXJfRUdGUl9OR0ZSX0RpZWRfd19vdGhlcl9zZWNvbmRfZHJ1Z3MucGRmJywgaGVpZ2h0ID0gMTQpCmdnYXJyYW5nZShwMSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpLHAyKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykscDMscDQsIG5yb3cgPSA0KQpkZXYub2ZmKCkKCiMgQWxzbyBsb29rIGF0IHJlYWRzIGluIGdETkEgb2YgdGhlc2UgcGxvdHM/Pz8/PwpgYGAKCiMgTG9vayBhdCB3aGV0aGVyIGxpbmVhZ2VzIGNsdXN0ZXIgdG9nZXRoZXIgaW4gZWFjaCBpbmRpdmlkdWFsIGNvbmRpdGlvbiAtIFN0YXJ0aW5nIHdpdGggRGFiVHJhbQpgYGB7cn0Kcm0oZGFidHJhbSwgY2lzLCBjb2NsMikgIyBSZW1vdmUgb2xkIHNldXJhdCBvYmplY3RzIHRoYXQgYXJlIG5vIGxvbmdlciBuZWVkZWQKSWRlbnRzKGFsbF9kYXRhKSA8LSBhbGxfZGF0YSRPR19jb25kaXRpb24gIyBDaGFuZ2UgdGhlIGlkZW50cyB0byB0aGUgT0cgY29uZGl0aW9uIGZvciBzdWJzZXR0aW5nIHRvIGRhYnRyYW0KZGFidHJhbSA8LSBzdWJzZXQoYWxsX2RhdGEsIGlkZW50cyA9ICdkYWJ0cmFtJykgIyBTdWJzZXQgZG93biB0byB0aGUgZGFidHJhbSBvYmplY3QKCkVsYm93UGxvdChkYWJ0cmFtKSAjIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gc2VlbXMgdG8gcmVhbGx5IGxldmVsIG9mZiBhdCAxMAoKIyBSZWNsdXN0ZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMKZGFidHJhbSA8LSBGaW5kTmVpZ2hib3JzKGRhYnRyYW0sIGRpbXMgPSAxOjEwKQpkYWJ0cmFtIDwtIEZpbmRDbHVzdGVycyhkYWJ0cmFtLCByZXNvbHV0aW9uID0gMC41KQpkYWJ0cmFtIDwtIFJ1blVNQVAoZGFidHJhbSwgZGltcyA9IDE6MTApCkRpbVBsb3QoZGFidHJhbSwgcmVkdWN0aW9uID0gJ3VtYXAnKQoKIyBCdWlsZCBsaXN0IG9mIGxpbmVhZ2VzIHdpdGggYXQgbGVhc3QgNSBjZWxscyBpbiBkYWIgdHJhbSBhbmQgY2hlY2sgd2hhdCBzZXVyYXQgY2x1c3RlciB0aGUgY2VsbHMgYXJlIGluIApkYWJ0cmFtX2xpbl9jbHVzdF9saXN0IDwtIGxpc3QoKQoKZm9yIChpIGluIGZpdmVjZWxsX2NETkEkRGFiVHJhbSl7CiAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKElkZW50cyhkYWJ0cmFtKVtkYWJ0cmFtJExpbmVhZ2UgPT0gaV0pKQogIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgZGFidHJhbV9saW5fY2x1c3RfbGlzdFtbaV1dIDwtIHRlbXBfZGYKfQoKIyBOZWVkIHRvIGRvIGEgcmFuZG9tIHNhbXBsaW5nIG9mIHRoZSBzYW1lIHRoaW5nIApkYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3QgPC0gbGlzdCgpCm51bV9pdGVyIDwtIDgwMCAKZm9yKGogaW4gMTpudW1faXRlcil7CiAgc2V0LnNlZWQoaikKICBkYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXSA8LSBsaXN0KCkKICBmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSREYWJUcmFtKXsKICAgIG51bV9jZWxscyA8LSBsZW5ndGgoZGFidHJhbSRMaW5lYWdlW2RhYnRyYW0kTGluZWFnZSA9PSBpXSkKICAgIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShzYW1wbGUoSWRlbnRzKGRhYnRyYW0pLCBudW1fY2VsbHMsIHJlcGxhY2UgPSBGKSkpCiAgICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICAgIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgICBkYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXVtbaV1dIDwtIHRlbXBfZGYKICB9Cn0KYGBgCiMgU2lnbmlmaWNhbmNlIHRlc3Rpbmcgb2YgdGhlIGRhYnRyYW0gc2ltdWxhdGlvbgpgYGB7cn0KIyBGaW5kIHRoZSBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24KbWVhbl9kYWJ0cmFtIDwtIG1lYW4odW5saXN0KGxhcHBseShkYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKQptZWFuc19kYWJ0cmFtX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0KSwgZnVuY3Rpb24oeSkKICBtZWFuKHVubGlzdChsYXBwbHkoZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpKQp6X21lYW5fZGFidHJhbSA8LSAobWVhbl9kYWJ0cmFtLW1lYW4obWVhbnNfZGFidHJhbV9zaW0pKS9zZChtZWFuc19kYWJ0cmFtX3NpbSkKcHZhbF9tZWFuX2RhYnRyYW0gPC0gcG5vcm0oel9tZWFuX2RhYnRyYW0sIG1lYW4obWVhbnNfZGFidHJhbV9zaW0pLCBzZChtZWFuc19kYWJ0cmFtX3NpbSksIGxvd2VyLnRhaWwgPSBGKQoKIyBGaW5kIHRoZSB3ZWlnaHRlZCBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24Kd2VpZ2h0ZWRfbWVhbl9kYWJ0cmFtIDwtIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShkYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAp1bmxpc3QobGFwcGx5KGRhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkKd2VpZ2h0ZWRfbWVhbnNfZGFidHJhbV9zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGRhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGRhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAogICAgICAgICAgICAgICAgdW5saXN0KGxhcHBseShkYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkKel93bWVhbl9kYWJ0cmFtIDwtICh3ZWlnaHRlZF9tZWFuX2RhYnRyYW0tbWVhbih3ZWlnaHRlZF9tZWFuc19kYWJ0cmFtX3NpbSkpL3NkKHdlaWdodGVkX21lYW5zX2RhYnRyYW1fc2ltKQpwdmFsX3dtZWFuX2RhYnRyYW0gPC0gcG5vcm0oel93bWVhbl9kYWJ0cmFtLCBtZWFuKHdlaWdodGVkX21lYW5zX2RhYnRyYW1fc2ltKSwgc2Qod2VpZ2h0ZWRfbWVhbnNfZGFidHJhbV9zaW0pLCBsb3dlci50YWlsID0gRikKCiMgQ29tcGFyZSBlYWNoIGluZGl2aWR1YWwgZGlzdHJpYnV0aW9uIG9mIG1heGVzIHRvIHRoZSBvYnNlcnZlZCBtYXggYnkgdCB0ZXN0IGFuZCB0cmFjayBwdmFsCnR0ZXN0X3B2YWxfZGFidHJhbSA8LSBjKCkKZm9yIChpIGluIDE6bGVuZ3RoKG1lYW5zX2RhYnRyYW1fc2ltKSl7CiAgc2ltX21heGVzIDwtIHVubGlzdChsYXBwbHkoZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1tpXV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkKICB0dGVzdF9wdmFsX2RhYnRyYW0gPC0gY2JpbmQodHRlc3RfcHZhbF9kYWJ0cmFtLHQudGVzdCh4ID0gdW5saXN0KGxhcHBseShkYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLHkgPSB1bmxpc3QobGFwcGx5KGRhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLCBhbHRlcm5hdGl2ZSA9ICdncmVhdGVyJykkcC52YWx1ZSkKfQoKIyBTYXZlIG91dHB1dHMKc2F2ZShkYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBkYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3Qsel9tZWFuX2RhYnRyYW0scHZhbF9tZWFuX2RhYnRyYW0sIHpfd21lYW5fZGFidHJhbSwgdHRlc3RfcHZhbF9kYWJ0cmFtLCBmaWxlID0gJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9kYWJ0cmFtX3NpbV9yZXN1bHRzLlJEYXRhJykKcm0oZGFidHJhbSkKYGBgCgojIExvb2sgYXQgd2hldGhlciBsaW5lYWdlcyBjbHVzdGVyIHRvZ2V0aGVyIGluIGVhY2ggaW5kaXZpZHVhbCBjb25kaXRpb24gLSAgRGFiVHJhbXRvRGFiVHJhbQpgYGB7cn0KSWRlbnRzKGFsbF9kYXRhKSA8LSBhbGxfZGF0YSRPR19jb25kaXRpb24gIyBDaGFuZ2UgdGhlIGlkZW50cyB0byB0aGUgT0cgY29uZGl0aW9uIGZvciBzdWJzZXR0aW5nIHRvIGRhYnRyYW10b2RhYnRyYW0KZGFidHJhbXRvZGFidHJhbSA8LSBzdWJzZXQoYWxsX2RhdGEsIGlkZW50cyA9ICdkYWJ0cmFtdG9kYWJ0cmFtJykgIyBTdWJzZXQgZG93biB0byB0aGUgZGFidHJhbXRvZGFidHJhbSBvYmplY3QKCkVsYm93UGxvdChkYWJ0cmFtdG9kYWJ0cmFtKSAjIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gc2VlbXMgdG8gcmVhbGx5IGxldmVsIG9mZiBhdCAxMAoKIyBSZWNsdXN0ZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMKZGFidHJhbXRvZGFidHJhbSA8LSBGaW5kTmVpZ2hib3JzKGRhYnRyYW10b2RhYnRyYW0sIGRpbXMgPSAxOjEwKQpkYWJ0cmFtdG9kYWJ0cmFtIDwtIEZpbmRDbHVzdGVycyhkYWJ0cmFtdG9kYWJ0cmFtLCByZXNvbHV0aW9uID0gMC41KQpkYWJ0cmFtdG9kYWJ0cmFtIDwtIFJ1blVNQVAoZGFidHJhbXRvZGFidHJhbSwgZGltcyA9IDE6MTApCkRpbVBsb3QoZGFidHJhbXRvZGFidHJhbSwgcmVkdWN0aW9uID0gJ3VtYXAnKQoKIyBCdWlsZCBsaXN0IG9mIGxpbmVhZ2VzIHdpdGggYXQgbGVhc3QgNSBjZWxscyBpbiBkYWIgdHJhbSBhbmQgY2hlY2sgd2hhdCBzZXVyYXQgY2x1c3RlciB0aGUgY2VsbHMgYXJlIGluIApkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0IDwtIGxpc3QoKQoKZm9yIChpIGluIGZpdmVjZWxsX2NETkEkRGFiVHJhbXRvRGFiVHJhbSl7CiAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKElkZW50cyhkYWJ0cmFtdG9kYWJ0cmFtKVtkYWJ0cmFtdG9kYWJ0cmFtJExpbmVhZ2UgPT0gaV0pKQogIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfbGlzdFtbaV1dIDwtIHRlbXBfZGYKfQoKIyBOZWVkIHRvIGRvIGEgcmFuZG9tIHNhbXBsaW5nIG9mIHRoZSBzYW1lIHRoaW5nIApkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3QgPC0gbGlzdCgpCm51bV9pdGVyIDwtIDgwMCAKZm9yKGogaW4gMTpudW1faXRlcil7CiAgc2V0LnNlZWQoaikKICBkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXSA8LSBsaXN0KCkKICBmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSREYWJUcmFtdG9EYWJUcmFtKXsKICAgIG51bV9jZWxscyA8LSBsZW5ndGgoZGFidHJhbXRvZGFidHJhbSRMaW5lYWdlW2RhYnRyYW10b2RhYnRyYW0kTGluZWFnZSA9PSBpXSkKICAgIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShzYW1wbGUoSWRlbnRzKGRhYnRyYW10b2RhYnRyYW0pLCBudW1fY2VsbHMsIHJlcGxhY2UgPSBGKSkpCiAgICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICAgIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgICBkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXVtbaV1dIDwtIHRlbXBfZGYKICB9Cn0KYGBgCgojIFNpZ25pZmljYW5jZSB0ZXN0aW5nIG9mIHRoZSBkYWJ0cmFtdG9kYWJ0cmFtIHNpbXVsYXRpb24KYGBge3J9CiMgRmluZCB0aGUgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCm1lYW5fZGFidHJhbXRvZGFidHJhbSA8LSBtZWFuKHVubGlzdChsYXBwbHkoZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSkKbWVhbnNfZGFidHJhbXRvZGFidHJhbV9zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGRhYnRyYW10b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgbWVhbih1bmxpc3QobGFwcGx5KGRhYnRyYW10b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKSkKel9tZWFuX2RhYnRyYW10b2RhYnRyYW0gPC0gKG1lYW5fZGFidHJhbXRvZGFidHJhbS1tZWFuKG1lYW5zX2RhYnRyYW10b2RhYnRyYW1fc2ltKSkvc2QobWVhbnNfZGFidHJhbXRvZGFidHJhbV9zaW0pCnB2YWxfbWVhbl9kYWJ0cmFtdG9kYWJ0cmFtIDwtIHBub3JtKHpfbWVhbl9kYWJ0cmFtdG9kYWJ0cmFtLCBtZWFuKG1lYW5zX2RhYnRyYW10b2RhYnRyYW1fc2ltKSwgc2QobWVhbnNfZGFidHJhbXRvZGFidHJhbV9zaW0pLCBsb3dlci50YWlsID0gRikKCiMgRmluZCB0aGUgd2VpZ2h0ZWQgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCndlaWdodGVkX21lYW5fZGFidHJhbXRvZGFidHJhbSA8LSB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKdW5saXN0KGxhcHBseShkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCndlaWdodGVkX21lYW5zX2RhYnRyYW10b2RhYnRyYW1fc2ltIDwtIHNhcHBseSgxOmxlbmd0aChkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkpCnpfd21lYW5fZGFidHJhbXRvZGFidHJhbSA8LSAod2VpZ2h0ZWRfbWVhbl9kYWJ0cmFtdG9kYWJ0cmFtLW1lYW4od2VpZ2h0ZWRfbWVhbnNfZGFidHJhbXRvZGFidHJhbV9zaW0pKS9zZCh3ZWlnaHRlZF9tZWFuc19kYWJ0cmFtdG9kYWJ0cmFtX3NpbSkKcHZhbF93bWVhbl9kYWJ0cmFtdG9kYWJ0cmFtIDwtIHBub3JtKHpfd21lYW5fZGFidHJhbXRvZGFidHJhbSwgbWVhbih3ZWlnaHRlZF9tZWFuc19kYWJ0cmFtdG9kYWJ0cmFtX3NpbSksIHNkKHdlaWdodGVkX21lYW5zX2RhYnRyYW10b2RhYnRyYW1fc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIENvbXBhcmUgZWFjaCBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbiBvZiBtYXhlcyB0byB0aGUgb2JzZXJ2ZWQgbWF4IGJ5IHQgdGVzdCBhbmQgdHJhY2sgcHZhbAp0dGVzdF9wdmFsX2RhYnRyYW10b2RhYnRyYW0gPC0gYygpCmZvciAoaSBpbiAxOmxlbmd0aChtZWFuc19kYWJ0cmFtdG9kYWJ0cmFtX3NpbSkpewogIHNpbV9tYXhlcyA8LSB1bmxpc3QobGFwcGx5KGRhYnRyYW10b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpCiAgdHRlc3RfcHZhbF9kYWJ0cmFtdG9kYWJ0cmFtIDwtIGNiaW5kKHR0ZXN0X3B2YWxfZGFidHJhbXRvZGFidHJhbSx0LnRlc3QoeCA9IHVubGlzdChsYXBwbHkoZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSx5ID0gdW5saXN0KGxhcHBseShkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwgYWx0ZXJuYXRpdmUgPSAnZ3JlYXRlcicpJHAudmFsdWUpCn0KCiMgU2F2ZSBvdXRwdXRzCnNhdmUoZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfbGlzdCwgZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0LHpfbWVhbl9kYWJ0cmFtdG9kYWJ0cmFtLHB2YWxfbWVhbl9kYWJ0cmFtdG9kYWJ0cmFtLCB6X3dtZWFuX2RhYnRyYW10b2RhYnRyYW0sIHR0ZXN0X3B2YWxfZGFidHJhbXRvZGFidHJhbSwgZmlsZSA9ICcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vZGFidHJhbXRvZGFidHJhbV9zaW1fcmVzdWx0cy5SRGF0YScpCnJtKGRhYnRyYW10b2RhYnRyYW0pCmBgYAoKIyBMb29rIGF0IHdoZXRoZXIgbGluZWFnZXMgY2x1c3RlciB0b2dldGhlciBpbiBlYWNoIGluZGl2aWR1YWwgY29uZGl0aW9uIC0gIERhYlRyYW10b0NpcwpgYGB7cn0KSWRlbnRzKGFsbF9kYXRhKSA8LSBhbGxfZGF0YSRPR19jb25kaXRpb24gIyBDaGFuZ2UgdGhlIGlkZW50cyB0byB0aGUgT0cgY29uZGl0aW9uIGZvciBzdWJzZXR0aW5nIHRvIGRhYnRyYW10b2NpcwpkYWJ0cmFtdG9jaXMgPC0gc3Vic2V0KGFsbF9kYXRhLCBpZGVudHMgPSAnZGFidHJhbXRvY2lzJykgIyBTdWJzZXQgZG93biB0byB0aGUgZGFidHJhbXRvY2lzIG9iamVjdAoKRWxib3dQbG90KGRhYnRyYW10b2NpcykgIyBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIHNlZW1zIHRvIHJlYWxseSBsZXZlbCBvZmYgYXQgMTAKCiMgUmVjbHVzdGVyIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBkaW1lbnNpb25zCmRhYnRyYW10b2NpcyA8LSBGaW5kTmVpZ2hib3JzKGRhYnRyYW10b2NpcywgZGltcyA9IDE6MTApCmRhYnRyYW10b2NpcyA8LSBGaW5kQ2x1c3RlcnMoZGFidHJhbXRvY2lzLCByZXNvbHV0aW9uID0gMC41KQpkYWJ0cmFtdG9jaXMgPC0gUnVuVU1BUChkYWJ0cmFtdG9jaXMsIGRpbXMgPSAxOjEwKQpEaW1QbG90KGRhYnRyYW10b2NpcywgcmVkdWN0aW9uID0gJ3VtYXAnKQoKIyBCdWlsZCBsaXN0IG9mIGxpbmVhZ2VzIHdpdGggYXQgbGVhc3QgNSBjZWxscyBpbiBkYWIgdHJhbSBhbmQgY2hlY2sgd2hhdCBzZXVyYXQgY2x1c3RlciB0aGUgY2VsbHMgYXJlIGluIApkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X2xpc3QgPC0gbGlzdCgpCgpmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSREYWJUcmFtdG9DaXMpewogIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShJZGVudHMoZGFidHJhbXRvY2lzKVtkYWJ0cmFtdG9jaXMkTGluZWFnZSA9PSBpXSkpCiAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgdGVtcF9kZiRQY250X2NlbGxzIDwtIHRlbXBfZGYkTnVtX2NlbGxzL3N1bSh0ZW1wX2RmJE51bV9jZWxscykKICBkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X2xpc3RbW2ldXSA8LSB0ZW1wX2RmCn0KCiMgTmVlZCB0byBkbyBhIHJhbmRvbSBzYW1wbGluZyBvZiB0aGUgc2FtZSB0aGluZyAKZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3QgPC0gbGlzdCgpCm51bV9pdGVyIDwtIDgwMCAKZm9yKGogaW4gMTpudW1faXRlcil7CiAgc2V0LnNlZWQoaikKICBkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbal1dIDwtIGxpc3QoKQogIGZvciAoaSBpbiBmaXZlY2VsbF9jRE5BJERhYlRyYW10b0Npcyl7CiAgICBudW1fY2VsbHMgPC0gbGVuZ3RoKGRhYnRyYW10b2NpcyRMaW5lYWdlW2RhYnRyYW10b2NpcyRMaW5lYWdlID09IGldKQogICAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHNhbXBsZShJZGVudHMoZGFidHJhbXRvY2lzKSwgbnVtX2NlbGxzLCByZXBsYWNlID0gRikpKQogICAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogICAgZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXVtbaV1dIDwtIHRlbXBfZGYKICB9Cn0KYGBgCgojIFNpZ25pZmljYW5jZSB0ZXN0aW5nIG9mIHRoZSBkYWJ0cmFtdG9jaXMgc2ltdWxhdGlvbgpgYGB7cn0KIyBGaW5kIHRoZSBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24KbWVhbl9kYWJ0cmFtdG9jaXMgPC0gbWVhbih1bmxpc3QobGFwcGx5KGRhYnRyYW10b2Npc19saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSkKbWVhbnNfZGFidHJhbXRvY2lzX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIG1lYW4odW5saXN0KGxhcHBseShkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKSkKel9tZWFuX2RhYnRyYW10b2NpcyA8LSAobWVhbl9kYWJ0cmFtdG9jaXMtbWVhbihtZWFuc19kYWJ0cmFtdG9jaXNfc2ltKSkvc2QobWVhbnNfZGFidHJhbXRvY2lzX3NpbSkKcHZhbF9tZWFuX2RhYnRyYW10b2NpcyA8LSBwbm9ybSh6X21lYW5fZGFidHJhbXRvY2lzLCBtZWFuKG1lYW5zX2RhYnRyYW10b2Npc19zaW0pLCBzZChtZWFuc19kYWJ0cmFtdG9jaXNfc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIEZpbmQgdGhlIHdlaWdodGVkIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgp3ZWlnaHRlZF9tZWFuX2RhYnRyYW10b2NpcyA8LSB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAp1bmxpc3QobGFwcGx5KGRhYnRyYW10b2Npc19saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKQp3ZWlnaHRlZF9tZWFuc19kYWJ0cmFtdG9jaXNfc2ltIDwtIHNhcHBseSgxOmxlbmd0aChkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGRhYnRyYW10b2Npc19saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCiAgICAgICAgICAgICAgICB1bmxpc3QobGFwcGx5KGRhYnRyYW10b2Npc19saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkpCnpfd21lYW5fZGFidHJhbXRvY2lzIDwtICh3ZWlnaHRlZF9tZWFuX2RhYnRyYW10b2Npcy1tZWFuKHdlaWdodGVkX21lYW5zX2RhYnRyYW10b2Npc19zaW0pKS9zZCh3ZWlnaHRlZF9tZWFuc19kYWJ0cmFtdG9jaXNfc2ltKQpwdmFsX3dtZWFuX2RhYnRyYW10b2NpcyA8LSBwbm9ybSh6X3dtZWFuX2RhYnRyYW10b2NpcywgbWVhbih3ZWlnaHRlZF9tZWFuc19kYWJ0cmFtdG9jaXNfc2ltKSwgc2Qod2VpZ2h0ZWRfbWVhbnNfZGFidHJhbXRvY2lzX3NpbSksIGxvd2VyLnRhaWwgPSBGKQoKIyBDb21wYXJlIGVhY2ggaW5kaXZpZHVhbCBkaXN0cmlidXRpb24gb2YgbWF4ZXMgdG8gdGhlIG9ic2VydmVkIG1heCBieSB0IHRlc3QgYW5kIHRyYWNrIHB2YWwKdHRlc3RfcHZhbF9kYWJ0cmFtdG9jaXMgPC0gYygpCmZvciAoaSBpbiAxOmxlbmd0aChtZWFuc19kYWJ0cmFtdG9jaXNfc2ltKSl7CiAgc2ltX21heGVzIDwtIHVubGlzdChsYXBwbHkoZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKQogIHR0ZXN0X3B2YWxfZGFidHJhbXRvY2lzIDwtIGNiaW5kKHR0ZXN0X3B2YWxfZGFidHJhbXRvY2lzLHQudGVzdCh4ID0gdW5saXN0KGxhcHBseShkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkseSA9IHVubGlzdChsYXBwbHkoZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwgYWx0ZXJuYXRpdmUgPSAnZ3JlYXRlcicpJHAudmFsdWUpCn0KCiMgU2F2ZSBvdXRwdXRzCnNhdmUoZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9saXN0LCBkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdCx6X21lYW5fZGFidHJhbXRvY2lzLHB2YWxfbWVhbl9kYWJ0cmFtdG9jaXMsIHpfd21lYW5fZGFidHJhbXRvY2lzLCB0dGVzdF9wdmFsX2RhYnRyYW10b2NpcywgZmlsZSA9ICcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vZGFidHJhbXRvY2lzX3NpbV9yZXN1bHRzLlJEYXRhJykKcm0oZGFidHJhbXRvY2lzKQpgYGAKCiMgTG9vayBhdCB3aGV0aGVyIGxpbmVhZ2VzIGNsdXN0ZXIgdG9nZXRoZXIgaW4gZWFjaCBpbmRpdmlkdWFsIGNvbmRpdGlvbiAtICBEYWJUcmFtdG9DaXMKYGBge3J9CklkZW50cyhhbGxfZGF0YSkgPC0gYWxsX2RhdGEkT0dfY29uZGl0aW9uICMgQ2hhbmdlIHRoZSBpZGVudHMgdG8gdGhlIE9HIGNvbmRpdGlvbiBmb3Igc3Vic2V0dGluZyB0byBkYWJ0cmFtdG9jb2NsMgpkYWJ0cmFtdG9jb2NsMiA8LSBzdWJzZXQoYWxsX2RhdGEsIGlkZW50cyA9ICdkYWJ0cmFtdG9jb2NsMicpICMgU3Vic2V0IGRvd24gdG8gdGhlIGRhYnRyYW10b2NvY2wyIG9iamVjdAoKRWxib3dQbG90KGRhYnRyYW10b2NvY2wyKSAjIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gc2VlbXMgdG8gcmVhbGx5IGxldmVsIG9mZiBhdCAxMAoKIyBSZWNsdXN0ZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMKZGFidHJhbXRvY29jbDIgPC0gRmluZE5laWdoYm9ycyhkYWJ0cmFtdG9jb2NsMiwgZGltcyA9IDE6MTApCmRhYnRyYW10b2NvY2wyIDwtIEZpbmRDbHVzdGVycyhkYWJ0cmFtdG9jb2NsMiwgcmVzb2x1dGlvbiA9IDAuNSkKZGFidHJhbXRvY29jbDIgPC0gUnVuVU1BUChkYWJ0cmFtdG9jb2NsMiwgZGltcyA9IDE6MTApCkRpbVBsb3QoZGFidHJhbXRvY29jbDIsIHJlZHVjdGlvbiA9ICd1bWFwJykKCiMgQnVpbGQgbGlzdCBvZiBsaW5lYWdlcyB3aXRoIGF0IGxlYXN0IDUgY2VsbHMgaW4gZGFiIHRyYW0gYW5kIGNoZWNrIHdoYXQgc2V1cmF0IGNsdXN0ZXIgdGhlIGNlbGxzIGFyZSBpbiAKZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X2xpc3QgPC0gbGlzdCgpCgpmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSREYWJUcmFtdG9Db0NsMil7CiAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKElkZW50cyhkYWJ0cmFtdG9jb2NsMilbZGFidHJhbXRvY29jbDIkTGluZWFnZSA9PSBpXSkpCiAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgdGVtcF9kZiRQY250X2NlbGxzIDwtIHRlbXBfZGYkTnVtX2NlbGxzL3N1bSh0ZW1wX2RmJE51bV9jZWxscykKICBkYWJ0cmFtdG9jb2NsMl9saW5fY2x1c3RfbGlzdFtbaV1dIDwtIHRlbXBfZGYKfQoKIyBOZWVkIHRvIGRvIGEgcmFuZG9tIHNhbXBsaW5nIG9mIHRoZSBzYW1lIHRoaW5nIApkYWJ0cmFtdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0IDwtIGxpc3QoKQpudW1faXRlciA8LSA4MDAgCmZvcihqIGluIDE6bnVtX2l0ZXIpewogIHNldC5zZWVkKGopCiAgZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbal1dIDwtIGxpc3QoKQogIGZvciAoaSBpbiBmaXZlY2VsbF9jRE5BJERhYlRyYW10b0NvQ2wyKXsKICAgIG51bV9jZWxscyA8LSBsZW5ndGgoZGFidHJhbXRvY29jbDIkTGluZWFnZVtkYWJ0cmFtdG9jb2NsMiRMaW5lYWdlID09IGldKQogICAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHNhbXBsZShJZGVudHMoZGFidHJhbXRvY29jbDIpLCBudW1fY2VsbHMsIHJlcGxhY2UgPSBGKSkpCiAgICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICAgIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgICBkYWJ0cmFtdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1tqXV1bW2ldXSA8LSB0ZW1wX2RmCiAgfQp9CmBgYAoKIyBTaWduaWZpY2FuY2UgdGVzdGluZyBvZiB0aGUgZGFidHJhbXRvY29jbDIgc2ltdWxhdGlvbgpgYGB7cn0KIyBGaW5kIHRoZSBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24KbWVhbl9kYWJ0cmFtdG9jb2NsMiA8LSBtZWFuKHVubGlzdChsYXBwbHkoZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpCm1lYW5zX2RhYnRyYW10b2NvY2wyX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgbWVhbih1bmxpc3QobGFwcGx5KGRhYnRyYW10b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSkpCnpfbWVhbl9kYWJ0cmFtdG9jb2NsMiA8LSAobWVhbl9kYWJ0cmFtdG9jb2NsMi1tZWFuKG1lYW5zX2RhYnRyYW10b2NvY2wyX3NpbSkpL3NkKG1lYW5zX2RhYnRyYW10b2NvY2wyX3NpbSkKcHZhbF9tZWFuX2RhYnRyYW10b2NvY2wyIDwtIHBub3JtKHpfbWVhbl9kYWJ0cmFtdG9jb2NsMiwgbWVhbihtZWFuc19kYWJ0cmFtdG9jb2NsMl9zaW0pLCBzZChtZWFuc19kYWJ0cmFtdG9jb2NsMl9zaW0pLCBsb3dlci50YWlsID0gRikKCiMgRmluZCB0aGUgd2VpZ2h0ZWQgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCndlaWdodGVkX21lYW5fZGFidHJhbXRvY29jbDIgPC0gd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGRhYnRyYW10b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAp1bmxpc3QobGFwcGx5KGRhYnRyYW10b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCndlaWdodGVkX21lYW5zX2RhYnRyYW10b2NvY2wyX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGRhYnRyYW10b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpKQp6X3dtZWFuX2RhYnRyYW10b2NvY2wyIDwtICh3ZWlnaHRlZF9tZWFuX2RhYnRyYW10b2NvY2wyLW1lYW4od2VpZ2h0ZWRfbWVhbnNfZGFidHJhbXRvY29jbDJfc2ltKSkvc2Qod2VpZ2h0ZWRfbWVhbnNfZGFidHJhbXRvY29jbDJfc2ltKQpwdmFsX3dtZWFuX2RhYnRyYW10b2NvY2wyIDwtIHBub3JtKHpfd21lYW5fZGFidHJhbXRvY29jbDIsIG1lYW4od2VpZ2h0ZWRfbWVhbnNfZGFidHJhbXRvY29jbDJfc2ltKSwgc2Qod2VpZ2h0ZWRfbWVhbnNfZGFidHJhbXRvY29jbDJfc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIENvbXBhcmUgZWFjaCBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbiBvZiBtYXhlcyB0byB0aGUgb2JzZXJ2ZWQgbWF4IGJ5IHQgdGVzdCBhbmQgdHJhY2sgcHZhbAp0dGVzdF9wdmFsX2RhYnRyYW10b2NvY2wyIDwtIGMoKQpmb3IgKGkgaW4gMTpsZW5ndGgobWVhbnNfZGFidHJhbXRvY29jbDJfc2ltKSl7CiAgc2ltX21heGVzIDwtIHVubGlzdChsYXBwbHkoZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpCiAgdHRlc3RfcHZhbF9kYWJ0cmFtdG9jb2NsMiA8LSBjYmluZCh0dGVzdF9wdmFsX2RhYnRyYW10b2NvY2wyLHQudGVzdCh4ID0gdW5saXN0KGxhcHBseShkYWJ0cmFtdG9jb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSx5ID0gdW5saXN0KGxhcHBseShkYWJ0cmFtdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1tpXV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksIGFsdGVybmF0aXZlID0gJ2dyZWF0ZXInKSRwLnZhbHVlKQp9CgojIFNhdmUgb3V0cHV0cwpzYXZlKGRhYnRyYW10b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBkYWJ0cmFtdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0LHpfbWVhbl9kYWJ0cmFtdG9jb2NsMixwdmFsX21lYW5fZGFidHJhbXRvY29jbDIsIHpfd21lYW5fZGFidHJhbXRvY29jbDIsIHR0ZXN0X3B2YWxfZGFidHJhbXRvY29jbDIsIGZpbGUgPSAnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL2RhYnRyYW10b2NvY2wyX3NpbV9yZXN1bHRzLlJEYXRhJykKcm0oZGFidHJhbXRvY29jbDIpCmBgYAoKIyBMb29rIGF0IHdoZXRoZXIgbGluZWFnZXMgY2x1c3RlciB0b2dldGhlciBpbiBlYWNoIGluZGl2aWR1YWwgY29uZGl0aW9uIC0gU3RhcnRpbmcgd2l0aCBEYWJUcmFtCmBgYHtyfQpJZGVudHMoYWxsX2RhdGEpIDwtIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiAjIENoYW5nZSB0aGUgaWRlbnRzIHRvIHRoZSBPRyBjb25kaXRpb24gZm9yIHN1YnNldHRpbmcgdG8gY29jbDIKY29jbDIgPC0gc3Vic2V0KGFsbF9kYXRhLCBpZGVudHMgPSAnY29jbDInKSAjIFN1YnNldCBkb3duIHRvIHRoZSBjb2NsMiBvYmplY3QKCkVsYm93UGxvdChjb2NsMikgIyBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIHNlZW1zIHRvIHJlYWxseSBsZXZlbCBvZmYgYXQgMTAKCiMgUmVjbHVzdGVyIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBkaW1lbnNpb25zCmNvY2wyIDwtIEZpbmROZWlnaGJvcnMoY29jbDIsIGRpbXMgPSAxOjEwKQpjb2NsMiA8LSBGaW5kQ2x1c3RlcnMoY29jbDIsIHJlc29sdXRpb24gPSAwLjUpCmNvY2wyIDwtIFJ1blVNQVAoY29jbDIsIGRpbXMgPSAxOjEwKQpEaW1QbG90KGNvY2wyLCByZWR1Y3Rpb24gPSAndW1hcCcpCgojIEJ1aWxkIGxpc3Qgb2YgbGluZWFnZXMgd2l0aCBhdCBsZWFzdCA1IGNlbGxzIGluIGRhYiB0cmFtIGFuZCBjaGVjayB3aGF0IHNldXJhdCBjbHVzdGVyIHRoZSBjZWxscyBhcmUgaW4gCmNvY2wyX2xpbl9jbHVzdF9saXN0IDwtIGxpc3QoKQoKZm9yIChpIGluIGZpdmVjZWxsX2NETkEkQ29DbDIpewogIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShJZGVudHMoY29jbDIpW2NvY2wyJExpbmVhZ2UgPT0gaV0pKQogIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgY29jbDJfbGluX2NsdXN0X2xpc3RbW2ldXSA8LSB0ZW1wX2RmCn0KCiMgTmVlZCB0byBkbyBhIHJhbmRvbSBzYW1wbGluZyBvZiB0aGUgc2FtZSB0aGluZyAKY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCA8LSBsaXN0KCkKbnVtX2l0ZXIgPC0gODAwIApmb3IoaiBpbiAxOm51bV9pdGVyKXsKICBzZXQuc2VlZChqKQogIGNvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXSA8LSBsaXN0KCkKICBmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSRDb0NsMil7CiAgICBudW1fY2VsbHMgPC0gbGVuZ3RoKGNvY2wyJExpbmVhZ2VbY29jbDIkTGluZWFnZSA9PSBpXSkKICAgIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShzYW1wbGUoSWRlbnRzKGNvY2wyKSwgbnVtX2NlbGxzLCByZXBsYWNlID0gRikpKQogICAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogICAgY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbal1dW1tpXV0gPC0gdGVtcF9kZgogIH0KfQpgYGAKIyBTaWduaWZpY2FuY2UgdGVzdGluZyBvZiB0aGUgY29jbDIgc2ltdWxhdGlvbgpgYGB7cn0KIyBGaW5kIHRoZSBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24KbWVhbl9jb2NsMiA8LSBtZWFuKHVubGlzdChsYXBwbHkoY29jbDJfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpCm1lYW5zX2NvY2wyX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgbWVhbih1bmxpc3QobGFwcGx5KGNvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSkpCnpfbWVhbl9jb2NsMiA8LSAobWVhbl9jb2NsMi1tZWFuKG1lYW5zX2NvY2wyX3NpbSkpL3NkKG1lYW5zX2NvY2wyX3NpbSkKcHZhbF9tZWFuX2NvY2wyIDwtIHBub3JtKHpfbWVhbl9jb2NsMiwgbWVhbihtZWFuc19jb2NsMl9zaW0pLCBzZChtZWFuc19jb2NsMl9zaW0pLCBsb3dlci50YWlsID0gRikKCiMgRmluZCB0aGUgd2VpZ2h0ZWQgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCndlaWdodGVkX21lYW5fY29jbDIgPC0gd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAp1bmxpc3QobGFwcGx5KGNvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCndlaWdodGVkX21lYW5zX2NvY2wyX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpKQp6X3dtZWFuX2NvY2wyIDwtICh3ZWlnaHRlZF9tZWFuX2NvY2wyLW1lYW4od2VpZ2h0ZWRfbWVhbnNfY29jbDJfc2ltKSkvc2Qod2VpZ2h0ZWRfbWVhbnNfY29jbDJfc2ltKQpwdmFsX3dtZWFuX2NvY2wyIDwtIHBub3JtKHpfd21lYW5fY29jbDIsIG1lYW4od2VpZ2h0ZWRfbWVhbnNfY29jbDJfc2ltKSwgc2Qod2VpZ2h0ZWRfbWVhbnNfY29jbDJfc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIENvbXBhcmUgZWFjaCBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbiBvZiBtYXhlcyB0byB0aGUgb2JzZXJ2ZWQgbWF4IGJ5IHQgdGVzdCBhbmQgdHJhY2sgcHZhbAp0dGVzdF9wdmFsX2NvY2wyIDwtIGMoKQpmb3IgKGkgaW4gMTpsZW5ndGgobWVhbnNfY29jbDJfc2ltKSl7CiAgc2ltX21heGVzIDwtIHVubGlzdChsYXBwbHkoY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpCiAgdHRlc3RfcHZhbF9jb2NsMiA8LSBjYmluZCh0dGVzdF9wdmFsX2NvY2wyLHQudGVzdCh4ID0gdW5saXN0KGxhcHBseShjb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSx5ID0gdW5saXN0KGxhcHBseShjb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1tpXV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksIGFsdGVybmF0aXZlID0gJ2dyZWF0ZXInKSRwLnZhbHVlKQp9CgojIFNhdmUgb3V0cHV0cwpzYXZlKGNvY2wyX2xpbl9jbHVzdF9saXN0LCBjb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0LHpfbWVhbl9jb2NsMixwdmFsX21lYW5fY29jbDIsIHpfd21lYW5fY29jbDIsIHR0ZXN0X3B2YWxfY29jbDIsIGZpbGUgPSAnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL2NvY2wyX3NpbV9yZXN1bHRzLlJEYXRhJykKcm0oY29jbDIpCmBgYAoKIyBMb29rIGF0IHdoZXRoZXIgbGluZWFnZXMgY2x1c3RlciB0b2dldGhlciBpbiBlYWNoIGluZGl2aWR1YWwgY29uZGl0aW9uIC0gU3RhcnRpbmcgd2l0aCBDb0NsMnRvQ29DbDIKYGBge3J9CklkZW50cyhhbGxfZGF0YSkgPC0gYWxsX2RhdGEkT0dfY29uZGl0aW9uICMgQ2hhbmdlIHRoZSBpZGVudHMgdG8gdGhlIE9HIGNvbmRpdGlvbiBmb3Igc3Vic2V0dGluZyB0byBjb2NsMnRvY29jbDIKY29jbDJ0b2NvY2wyIDwtIHN1YnNldChhbGxfZGF0YSwgaWRlbnRzID0gJ2NvY2wydG9jb2NsMicpICMgU3Vic2V0IGRvd24gdG8gdGhlIGNvY2wydG9jb2NsMiBvYmplY3QKCkVsYm93UGxvdChjb2NsMnRvY29jbDIpICMgVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBzZWVtcyB0byByZWFsbHkgbGV2ZWwgb2ZmIGF0IDEwCgojIFJlY2x1c3RlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgZGltZW5zaW9ucwpjb2NsMnRvY29jbDIgPC0gRmluZE5laWdoYm9ycyhjb2NsMnRvY29jbDIsIGRpbXMgPSAxOjEwKQpjb2NsMnRvY29jbDIgPC0gRmluZENsdXN0ZXJzKGNvY2wydG9jb2NsMiwgcmVzb2x1dGlvbiA9IDAuNSkKY29jbDJ0b2NvY2wyIDwtIFJ1blVNQVAoY29jbDJ0b2NvY2wyLCBkaW1zID0gMToxMCkKRGltUGxvdChjb2NsMnRvY29jbDIsIHJlZHVjdGlvbiA9ICd1bWFwJykKCiMgQnVpbGQgbGlzdCBvZiBsaW5lYWdlcyB3aXRoIGF0IGxlYXN0IDUgY2VsbHMgaW4gZGFiIHRyYW0gYW5kIGNoZWNrIHdoYXQgc2V1cmF0IGNsdXN0ZXIgdGhlIGNlbGxzIGFyZSBpbiAKY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9saXN0IDwtIGxpc3QoKQoKZm9yIChpIGluIGZpdmVjZWxsX2NETkEkQ29DbDJ0b0NvQ2wyKXsKICB0ZW1wX2RmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoSWRlbnRzKGNvY2wydG9jb2NsMilbY29jbDJ0b2NvY2wyJExpbmVhZ2UgPT0gaV0pKQogIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9saXN0W1tpXV0gPC0gdGVtcF9kZgp9CgojIE5lZWQgdG8gZG8gYSByYW5kb20gc2FtcGxpbmcgb2YgdGhlIHNhbWUgdGhpbmcgCmNvY2wydG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0IDwtIGxpc3QoKQpudW1faXRlciA8LSA4MDAgCmZvcihqIGluIDE6bnVtX2l0ZXIpewogIHNldC5zZWVkKGopCiAgY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXSA8LSBsaXN0KCkKICBmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSRDb0NsMnRvQ29DbDIpewogICAgbnVtX2NlbGxzIDwtIGxlbmd0aChjb2NsMnRvY29jbDIkTGluZWFnZVtjb2NsMnRvY29jbDIkTGluZWFnZSA9PSBpXSkKICAgIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShzYW1wbGUoSWRlbnRzKGNvY2wydG9jb2NsMiksIG51bV9jZWxscywgcmVwbGFjZSA9IEYpKSkKICAgIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogICAgdGVtcF9kZiRQY250X2NlbGxzIDwtIHRlbXBfZGYkTnVtX2NlbGxzL3N1bSh0ZW1wX2RmJE51bV9jZWxscykKICAgIGNvY2wydG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1tqXV1bW2ldXSA8LSB0ZW1wX2RmCiAgfQp9CmBgYAojIFNpZ25pZmljYW5jZSB0ZXN0aW5nIG9mIHRoZSBjb2NsMnRvY29jbDIgc2ltdWxhdGlvbgpgYGB7cn0KIyBGaW5kIHRoZSBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24KbWVhbl9jb2NsMnRvY29jbDIgPC0gbWVhbih1bmxpc3QobGFwcGx5KGNvY2wydG9jb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSkKbWVhbnNfY29jbDJ0b2NvY2wyX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIG1lYW4odW5saXN0KGxhcHBseShjb2NsMnRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKSkKel9tZWFuX2NvY2wydG9jb2NsMiA8LSAobWVhbl9jb2NsMnRvY29jbDItbWVhbihtZWFuc19jb2NsMnRvY29jbDJfc2ltKSkvc2QobWVhbnNfY29jbDJ0b2NvY2wyX3NpbSkKcHZhbF9tZWFuX2NvY2wydG9jb2NsMiA8LSBwbm9ybSh6X21lYW5fY29jbDJ0b2NvY2wyLCBtZWFuKG1lYW5zX2NvY2wydG9jb2NsMl9zaW0pLCBzZChtZWFuc19jb2NsMnRvY29jbDJfc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIEZpbmQgdGhlIHdlaWdodGVkIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgp3ZWlnaHRlZF9tZWFuX2NvY2wydG9jb2NsMiA8LSB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAp1bmxpc3QobGFwcGx5KGNvY2wydG9jb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKQp3ZWlnaHRlZF9tZWFuc19jb2NsMnRvY29jbDJfc2ltIDwtIHNhcHBseSgxOmxlbmd0aChjb2NsMnRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNvY2wydG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCiAgICAgICAgICAgICAgICB1bmxpc3QobGFwcGx5KGNvY2wydG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkpCnpfd21lYW5fY29jbDJ0b2NvY2wyIDwtICh3ZWlnaHRlZF9tZWFuX2NvY2wydG9jb2NsMi1tZWFuKHdlaWdodGVkX21lYW5zX2NvY2wydG9jb2NsMl9zaW0pKS9zZCh3ZWlnaHRlZF9tZWFuc19jb2NsMnRvY29jbDJfc2ltKQpwdmFsX3dtZWFuX2NvY2wydG9jb2NsMiA8LSBwbm9ybSh6X3dtZWFuX2NvY2wydG9jb2NsMiwgbWVhbih3ZWlnaHRlZF9tZWFuc19jb2NsMnRvY29jbDJfc2ltKSwgc2Qod2VpZ2h0ZWRfbWVhbnNfY29jbDJ0b2NvY2wyX3NpbSksIGxvd2VyLnRhaWwgPSBGKQoKIyBDb21wYXJlIGVhY2ggaW5kaXZpZHVhbCBkaXN0cmlidXRpb24gb2YgbWF4ZXMgdG8gdGhlIG9ic2VydmVkIG1heCBieSB0IHRlc3QgYW5kIHRyYWNrIHB2YWwKdHRlc3RfcHZhbF9jb2NsMnRvY29jbDIgPC0gYygpCmZvciAoaSBpbiAxOmxlbmd0aChtZWFuc19jb2NsMnRvY29jbDJfc2ltKSl7CiAgc2ltX21heGVzIDwtIHVubGlzdChsYXBwbHkoY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKQogIHR0ZXN0X3B2YWxfY29jbDJ0b2NvY2wyIDwtIGNiaW5kKHR0ZXN0X3B2YWxfY29jbDJ0b2NvY2wyLHQudGVzdCh4ID0gdW5saXN0KGxhcHBseShjb2NsMnRvY29jbDJfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkseSA9IHVubGlzdChsYXBwbHkoY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwgYWx0ZXJuYXRpdmUgPSAnZ3JlYXRlcicpJHAudmFsdWUpCn0KCiMgU2F2ZSBvdXRwdXRzCnNhdmUoY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBjb2NsMnRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCx6X21lYW5fY29jbDJ0b2NvY2wyLHB2YWxfbWVhbl9jb2NsMnRvY29jbDIsIHpfd21lYW5fY29jbDJ0b2NvY2wyLCB0dGVzdF9wdmFsX2NvY2wydG9jb2NsMiwgZmlsZSA9ICcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vY29jbDJ0b2NvY2wyX3NpbV9yZXN1bHRzLlJEYXRhJykKcm0oY29jbDJ0b2NvY2wyKQpgYGAKCiMgTG9vayBhdCB3aGV0aGVyIGxpbmVhZ2VzIGNsdXN0ZXIgdG9nZXRoZXIgaW4gZWFjaCBpbmRpdmlkdWFsIGNvbmRpdGlvbiAtIFN0YXJ0aW5nIHdpdGggQ29DbDJ0b0NpcwpgYGB7cn0KSWRlbnRzKGFsbF9kYXRhKSA8LSBhbGxfZGF0YSRPR19jb25kaXRpb24gIyBDaGFuZ2UgdGhlIGlkZW50cyB0byB0aGUgT0cgY29uZGl0aW9uIGZvciBzdWJzZXR0aW5nIHRvIGNvY2wydG9jaXMKY29jbDJ0b2NpcyA8LSBzdWJzZXQoYWxsX2RhdGEsIGlkZW50cyA9ICdjb2NsMnRvY2lzJykgIyBTdWJzZXQgZG93biB0byB0aGUgY29jbDJ0b2NpcyBvYmplY3QKCkVsYm93UGxvdChjb2NsMnRvY2lzKSAjIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gc2VlbXMgdG8gcmVhbGx5IGxldmVsIG9mZiBhdCAxMAoKIyBSZWNsdXN0ZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMKY29jbDJ0b2NpcyA8LSBGaW5kTmVpZ2hib3JzKGNvY2wydG9jaXMsIGRpbXMgPSAxOjEwKQpjb2NsMnRvY2lzIDwtIEZpbmRDbHVzdGVycyhjb2NsMnRvY2lzLCByZXNvbHV0aW9uID0gMC41KQpjb2NsMnRvY2lzIDwtIFJ1blVNQVAoY29jbDJ0b2NpcywgZGltcyA9IDE6MTApCkRpbVBsb3QoY29jbDJ0b2NpcywgcmVkdWN0aW9uID0gJ3VtYXAnKQoKIyBCdWlsZCBsaXN0IG9mIGxpbmVhZ2VzIHdpdGggYXQgbGVhc3QgNSBjZWxscyBpbiBkYWIgdHJhbSBhbmQgY2hlY2sgd2hhdCBzZXVyYXQgY2x1c3RlciB0aGUgY2VsbHMgYXJlIGluIApjb2NsMnRvY2lzX2xpbl9jbHVzdF9saXN0IDwtIGxpc3QoKQoKZm9yIChpIGluIGZpdmVjZWxsX2NETkEkQ29DbDJ0b0Npcyl7CiAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKElkZW50cyhjb2NsMnRvY2lzKVtjb2NsMnRvY2lzJExpbmVhZ2UgPT0gaV0pKQogIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgY29jbDJ0b2Npc19saW5fY2x1c3RfbGlzdFtbaV1dIDwtIHRlbXBfZGYKfQoKIyBOZWVkIHRvIGRvIGEgcmFuZG9tIHNhbXBsaW5nIG9mIHRoZSBzYW1lIHRoaW5nIApjb2NsMnRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3QgPC0gbGlzdCgpCm51bV9pdGVyIDwtIDgwMCAKZm9yKGogaW4gMTpudW1faXRlcil7CiAgc2V0LnNlZWQoaikKICBjb2NsMnRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXSA8LSBsaXN0KCkKICBmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSRDb0NsMnRvQ2lzKXsKICAgIG51bV9jZWxscyA8LSBsZW5ndGgoY29jbDJ0b2NpcyRMaW5lYWdlW2NvY2wydG9jaXMkTGluZWFnZSA9PSBpXSkKICAgIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShzYW1wbGUoSWRlbnRzKGNvY2wydG9jaXMpLCBudW1fY2VsbHMsIHJlcGxhY2UgPSBGKSkpCiAgICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICAgIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgICBjb2NsMnRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXVtbaV1dIDwtIHRlbXBfZGYKICB9Cn0KYGBgCiMgU2lnbmlmaWNhbmNlIHRlc3Rpbmcgb2YgdGhlIGNvY2wydG9jaXMgc2ltdWxhdGlvbgpgYGB7cn0KIyBGaW5kIHRoZSBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24KbWVhbl9jb2NsMnRvY2lzIDwtIG1lYW4odW5saXN0KGxhcHBseShjb2NsMnRvY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKQptZWFuc19jb2NsMnRvY2lzX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoY29jbDJ0b2Npc19saW5fY2x1c3RfcmFuZF9saXN0KSwgZnVuY3Rpb24oeSkKICBtZWFuKHVubGlzdChsYXBwbHkoY29jbDJ0b2Npc19saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpKQp6X21lYW5fY29jbDJ0b2NpcyA8LSAobWVhbl9jb2NsMnRvY2lzLW1lYW4obWVhbnNfY29jbDJ0b2Npc19zaW0pKS9zZChtZWFuc19jb2NsMnRvY2lzX3NpbSkKcHZhbF9tZWFuX2NvY2wydG9jaXMgPC0gcG5vcm0oel9tZWFuX2NvY2wydG9jaXMsIG1lYW4obWVhbnNfY29jbDJ0b2Npc19zaW0pLCBzZChtZWFuc19jb2NsMnRvY2lzX3NpbSksIGxvd2VyLnRhaWwgPSBGKQoKIyBGaW5kIHRoZSB3ZWlnaHRlZCBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24Kd2VpZ2h0ZWRfbWVhbl9jb2NsMnRvY2lzIDwtIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjb2NsMnRvY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAp1bmxpc3QobGFwcGx5KGNvY2wydG9jaXNfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkKd2VpZ2h0ZWRfbWVhbnNfY29jbDJ0b2Npc19zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGNvY2wydG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNvY2wydG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAogICAgICAgICAgICAgICAgdW5saXN0KGxhcHBseShjb2NsMnRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkKel93bWVhbl9jb2NsMnRvY2lzIDwtICh3ZWlnaHRlZF9tZWFuX2NvY2wydG9jaXMtbWVhbih3ZWlnaHRlZF9tZWFuc19jb2NsMnRvY2lzX3NpbSkpL3NkKHdlaWdodGVkX21lYW5zX2NvY2wydG9jaXNfc2ltKQpwdmFsX3dtZWFuX2NvY2wydG9jaXMgPC0gcG5vcm0oel93bWVhbl9jb2NsMnRvY2lzLCBtZWFuKHdlaWdodGVkX21lYW5zX2NvY2wydG9jaXNfc2ltKSwgc2Qod2VpZ2h0ZWRfbWVhbnNfY29jbDJ0b2Npc19zaW0pLCBsb3dlci50YWlsID0gRikKCiMgQ29tcGFyZSBlYWNoIGluZGl2aWR1YWwgZGlzdHJpYnV0aW9uIG9mIG1heGVzIHRvIHRoZSBvYnNlcnZlZCBtYXggYnkgdCB0ZXN0IGFuZCB0cmFjayBwdmFsCnR0ZXN0X3B2YWxfY29jbDJ0b2NpcyA8LSBjKCkKZm9yIChpIGluIDE6bGVuZ3RoKG1lYW5zX2NvY2wydG9jaXNfc2ltKSl7CiAgc2ltX21heGVzIDwtIHVubGlzdChsYXBwbHkoY29jbDJ0b2Npc19saW5fY2x1c3RfcmFuZF9saXN0W1tpXV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkKICB0dGVzdF9wdmFsX2NvY2wydG9jaXMgPC0gY2JpbmQodHRlc3RfcHZhbF9jb2NsMnRvY2lzLHQudGVzdCh4ID0gdW5saXN0KGxhcHBseShjb2NsMnRvY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLHkgPSB1bmxpc3QobGFwcGx5KGNvY2wydG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLCBhbHRlcm5hdGl2ZSA9ICdncmVhdGVyJykkcC52YWx1ZSkKfQoKIyBTYXZlIG91dHB1dHMKc2F2ZShjb2NsMnRvY2lzX2xpbl9jbHVzdF9saXN0LCBjb2NsMnRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3Qsel9tZWFuX2NvY2wydG9jaXMscHZhbF9tZWFuX2NvY2wydG9jaXMsIHpfd21lYW5fY29jbDJ0b2NpcywgdHRlc3RfcHZhbF9jb2NsMnRvY2lzLCBmaWxlID0gJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9jb2NsMnRvY2lzX3NpbV9yZXN1bHRzLlJEYXRhJykKcm0oY29jbDJ0b2NpcykKYGBgCgojIExvb2sgYXQgd2hldGhlciBsaW5lYWdlcyBjbHVzdGVyIHRvZ2V0aGVyIGluIGVhY2ggaW5kaXZpZHVhbCBjb25kaXRpb24gLSBTdGFydGluZyB3aXRoIENvQ2wydG9EYWJUcmFtCmBgYHtyfQpJZGVudHMoYWxsX2RhdGEpIDwtIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiAjIENoYW5nZSB0aGUgaWRlbnRzIHRvIHRoZSBPRyBjb25kaXRpb24gZm9yIHN1YnNldHRpbmcgdG8gY29jbDJ0b2RhYnRyYW0KY29jbDJ0b2RhYnRyYW0gPC0gc3Vic2V0KGFsbF9kYXRhLCBpZGVudHMgPSAnY29jbDJ0b2RhYnRyYW0nKSAjIFN1YnNldCBkb3duIHRvIHRoZSBjb2NsMnRvZGFidHJhbSBvYmplY3QKCkVsYm93UGxvdChjb2NsMnRvZGFidHJhbSkgIyBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIHNlZW1zIHRvIHJlYWxseSBsZXZlbCBvZmYgYXQgMTAKCiMgUmVjbHVzdGVyIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBkaW1lbnNpb25zCmNvY2wydG9kYWJ0cmFtIDwtIEZpbmROZWlnaGJvcnMoY29jbDJ0b2RhYnRyYW0sIGRpbXMgPSAxOjEwKQpjb2NsMnRvZGFidHJhbSA8LSBGaW5kQ2x1c3RlcnMoY29jbDJ0b2RhYnRyYW0sIHJlc29sdXRpb24gPSAwLjUpCmNvY2wydG9kYWJ0cmFtIDwtIFJ1blVNQVAoY29jbDJ0b2RhYnRyYW0sIGRpbXMgPSAxOjEwKQpEaW1QbG90KGNvY2wydG9kYWJ0cmFtLCByZWR1Y3Rpb24gPSAndW1hcCcpCgojIEJ1aWxkIGxpc3Qgb2YgbGluZWFnZXMgd2l0aCBhdCBsZWFzdCA1IGNlbGxzIGluIGRhYiB0cmFtIGFuZCBjaGVjayB3aGF0IHNldXJhdCBjbHVzdGVyIHRoZSBjZWxscyBhcmUgaW4gCmNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0IDwtIGxpc3QoKQoKZm9yIChpIGluIGZpdmVjZWxsX2NETkEkQ29DbDJ0b0RhYlRyYW0pewogIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShJZGVudHMoY29jbDJ0b2RhYnRyYW0pW2NvY2wydG9kYWJ0cmFtJExpbmVhZ2UgPT0gaV0pKQogIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X2xpc3RbW2ldXSA8LSB0ZW1wX2RmCn0KCiMgTmVlZCB0byBkbyBhIHJhbmRvbSBzYW1wbGluZyBvZiB0aGUgc2FtZSB0aGluZyAKY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCA8LSBsaXN0KCkKbnVtX2l0ZXIgPC0gODAwIApmb3IoaiBpbiAxOm51bV9pdGVyKXsKICBzZXQuc2VlZChqKQogIGNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXSA8LSBsaXN0KCkKICBmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSRDb0NsMnRvRGFiVHJhbSl7CiAgICBudW1fY2VsbHMgPC0gbGVuZ3RoKGNvY2wydG9kYWJ0cmFtJExpbmVhZ2VbY29jbDJ0b2RhYnRyYW0kTGluZWFnZSA9PSBpXSkKICAgIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShzYW1wbGUoSWRlbnRzKGNvY2wydG9kYWJ0cmFtKSwgbnVtX2NlbGxzLCByZXBsYWNlID0gRikpKQogICAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogICAgY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbal1dW1tpXV0gPC0gdGVtcF9kZgogIH0KfQpgYGAKIyBTaWduaWZpY2FuY2UgdGVzdGluZyBvZiB0aGUgY29jbDJ0b2RhYnRyYW0gc2ltdWxhdGlvbgpgYGB7cn0KIyBGaW5kIHRoZSBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24KbWVhbl9jb2NsMnRvZGFidHJhbSA8LSBtZWFuKHVubGlzdChsYXBwbHkoY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpCm1lYW5zX2NvY2wydG9kYWJ0cmFtX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgbWVhbih1bmxpc3QobGFwcGx5KGNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSkpCnpfbWVhbl9jb2NsMnRvZGFidHJhbSA8LSAobWVhbl9jb2NsMnRvZGFidHJhbS1tZWFuKG1lYW5zX2NvY2wydG9kYWJ0cmFtX3NpbSkpL3NkKG1lYW5zX2NvY2wydG9kYWJ0cmFtX3NpbSkKcHZhbF9tZWFuX2NvY2wydG9kYWJ0cmFtIDwtIHBub3JtKHpfbWVhbl9jb2NsMnRvZGFidHJhbSwgbWVhbihtZWFuc19jb2NsMnRvZGFidHJhbV9zaW0pLCBzZChtZWFuc19jb2NsMnRvZGFidHJhbV9zaW0pLCBsb3dlci50YWlsID0gRikKCiMgRmluZCB0aGUgd2VpZ2h0ZWQgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCndlaWdodGVkX21lYW5fY29jbDJ0b2RhYnRyYW0gPC0gd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAp1bmxpc3QobGFwcGx5KGNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCndlaWdodGVkX21lYW5zX2NvY2wydG9kYWJ0cmFtX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpKQp6X3dtZWFuX2NvY2wydG9kYWJ0cmFtIDwtICh3ZWlnaHRlZF9tZWFuX2NvY2wydG9kYWJ0cmFtLW1lYW4od2VpZ2h0ZWRfbWVhbnNfY29jbDJ0b2RhYnRyYW1fc2ltKSkvc2Qod2VpZ2h0ZWRfbWVhbnNfY29jbDJ0b2RhYnRyYW1fc2ltKQpwdmFsX3dtZWFuX2NvY2wydG9kYWJ0cmFtIDwtIHBub3JtKHpfd21lYW5fY29jbDJ0b2RhYnRyYW0sIG1lYW4od2VpZ2h0ZWRfbWVhbnNfY29jbDJ0b2RhYnRyYW1fc2ltKSwgc2Qod2VpZ2h0ZWRfbWVhbnNfY29jbDJ0b2RhYnRyYW1fc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIENvbXBhcmUgZWFjaCBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbiBvZiBtYXhlcyB0byB0aGUgb2JzZXJ2ZWQgbWF4IGJ5IHQgdGVzdCBhbmQgdHJhY2sgcHZhbAp0dGVzdF9wdmFsX2NvY2wydG9kYWJ0cmFtIDwtIGMoKQpmb3IgKGkgaW4gMTpsZW5ndGgobWVhbnNfY29jbDJ0b2RhYnRyYW1fc2ltKSl7CiAgc2ltX21heGVzIDwtIHVubGlzdChsYXBwbHkoY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpCiAgdHRlc3RfcHZhbF9jb2NsMnRvZGFidHJhbSA8LSBjYmluZCh0dGVzdF9wdmFsX2NvY2wydG9kYWJ0cmFtLHQudGVzdCh4ID0gdW5saXN0KGxhcHBseShjb2NsMnRvZGFidHJhbV9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSx5ID0gdW5saXN0KGxhcHBseShjb2NsMnRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1tpXV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksIGFsdGVybmF0aXZlID0gJ2dyZWF0ZXInKSRwLnZhbHVlKQp9CgojIFNhdmUgb3V0cHV0cwpzYXZlKGNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBjb2NsMnRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0LHpfbWVhbl9jb2NsMnRvZGFidHJhbSxwdmFsX21lYW5fY29jbDJ0b2RhYnRyYW0sIHpfd21lYW5fY29jbDJ0b2RhYnRyYW0sIHR0ZXN0X3B2YWxfY29jbDJ0b2RhYnRyYW0sIGZpbGUgPSAnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL2NvY2wydG9kYWJ0cmFtX3NpbV9yZXN1bHRzLlJEYXRhJykKcm0oY29jbDJ0b2RhYnRyYW0pCmBgYAoKIyBMb29rIGF0IHdoZXRoZXIgbGluZWFnZXMgY2x1c3RlciB0b2dldGhlciBpbiBlYWNoIGluZGl2aWR1YWwgY29uZGl0aW9uIC0gU3RhcnRpbmcgd2l0aCBDaXMKYGBge3J9CklkZW50cyhhbGxfZGF0YSkgPC0gYWxsX2RhdGEkT0dfY29uZGl0aW9uICMgQ2hhbmdlIHRoZSBpZGVudHMgdG8gdGhlIE9HIGNvbmRpdGlvbiBmb3Igc3Vic2V0dGluZyB0byBjaXMKY2lzIDwtIHN1YnNldChhbGxfZGF0YSwgaWRlbnRzID0gJ2NpcycpICMgU3Vic2V0IGRvd24gdG8gdGhlIGNpcyBvYmplY3QKCkVsYm93UGxvdChjaXMpICMgVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBzZWVtcyB0byByZWFsbHkgbGV2ZWwgb2ZmIGF0IDEwCgojIFJlY2x1c3RlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgZGltZW5zaW9ucwpjaXMgPC0gRmluZE5laWdoYm9ycyhjaXMsIGRpbXMgPSAxOjEwKQpjaXMgPC0gRmluZENsdXN0ZXJzKGNpcywgcmVzb2x1dGlvbiA9IDAuNSkKY2lzIDwtIFJ1blVNQVAoY2lzLCBkaW1zID0gMToxMCkKRGltUGxvdChjaXMsIHJlZHVjdGlvbiA9ICd1bWFwJykKCiMgQnVpbGQgbGlzdCBvZiBsaW5lYWdlcyB3aXRoIGF0IGxlYXN0IDUgY2VsbHMgaW4gZGFiIHRyYW0gYW5kIGNoZWNrIHdoYXQgc2V1cmF0IGNsdXN0ZXIgdGhlIGNlbGxzIGFyZSBpbiAKY2lzX2xpbl9jbHVzdF9saXN0IDwtIGxpc3QoKQoKZm9yIChpIGluIGZpdmVjZWxsX2NETkEkQ2lzKXsKICB0ZW1wX2RmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoSWRlbnRzKGNpcylbY2lzJExpbmVhZ2UgPT0gaV0pKQogIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgY2lzX2xpbl9jbHVzdF9saXN0W1tpXV0gPC0gdGVtcF9kZgp9CgojIE5lZWQgdG8gZG8gYSByYW5kb20gc2FtcGxpbmcgb2YgdGhlIHNhbWUgdGhpbmcgCmNpc19saW5fY2x1c3RfcmFuZF9saXN0IDwtIGxpc3QoKQpudW1faXRlciA8LSA4MDAgCmZvcihqIGluIDE6bnVtX2l0ZXIpewogIHNldC5zZWVkKGopCiAgY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXSA8LSBsaXN0KCkKICBmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSRDaXMpewogICAgbnVtX2NlbGxzIDwtIGxlbmd0aChjaXMkTGluZWFnZVtjaXMkTGluZWFnZSA9PSBpXSkKICAgIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShzYW1wbGUoSWRlbnRzKGNpcyksIG51bV9jZWxscywgcmVwbGFjZSA9IEYpKSkKICAgIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogICAgdGVtcF9kZiRQY250X2NlbGxzIDwtIHRlbXBfZGYkTnVtX2NlbGxzL3N1bSh0ZW1wX2RmJE51bV9jZWxscykKICAgIGNpc19saW5fY2x1c3RfcmFuZF9saXN0W1tqXV1bW2ldXSA8LSB0ZW1wX2RmCiAgfQp9CmBgYAojIFNpZ25pZmljYW5jZSB0ZXN0aW5nIG9mIHRoZSBjaXMgc2ltdWxhdGlvbgpgYGB7cn0KIyBGaW5kIHRoZSBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24KbWVhbl9jaXMgPC0gbWVhbih1bmxpc3QobGFwcGx5KGNpc19saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSkKbWVhbnNfY2lzX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIG1lYW4odW5saXN0KGxhcHBseShjaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKSkKel9tZWFuX2NpcyA8LSAobWVhbl9jaXMtbWVhbihtZWFuc19jaXNfc2ltKSkvc2QobWVhbnNfY2lzX3NpbSkKcHZhbF9tZWFuX2NpcyA8LSBwbm9ybSh6X21lYW5fY2lzLCBtZWFuKG1lYW5zX2Npc19zaW0pLCBzZChtZWFuc19jaXNfc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIEZpbmQgdGhlIHdlaWdodGVkIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgp3ZWlnaHRlZF9tZWFuX2NpcyA8LSB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAp1bmxpc3QobGFwcGx5KGNpc19saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKQp3ZWlnaHRlZF9tZWFuc19jaXNfc2ltIDwtIHNhcHBseSgxOmxlbmd0aChjaXNfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNpc19saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCiAgICAgICAgICAgICAgICB1bmxpc3QobGFwcGx5KGNpc19saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkpCnpfd21lYW5fY2lzIDwtICh3ZWlnaHRlZF9tZWFuX2Npcy1tZWFuKHdlaWdodGVkX21lYW5zX2Npc19zaW0pKS9zZCh3ZWlnaHRlZF9tZWFuc19jaXNfc2ltKQpwdmFsX3dtZWFuX2NpcyA8LSBwbm9ybSh6X3dtZWFuX2NpcywgbWVhbih3ZWlnaHRlZF9tZWFuc19jaXNfc2ltKSwgc2Qod2VpZ2h0ZWRfbWVhbnNfY2lzX3NpbSksIGxvd2VyLnRhaWwgPSBGKQoKIyBDb21wYXJlIGVhY2ggaW5kaXZpZHVhbCBkaXN0cmlidXRpb24gb2YgbWF4ZXMgdG8gdGhlIG9ic2VydmVkIG1heCBieSB0IHRlc3QgYW5kIHRyYWNrIHB2YWwKdHRlc3RfcHZhbF9jaXMgPC0gYygpCmZvciAoaSBpbiAxOmxlbmd0aChtZWFuc19jaXNfc2ltKSl7CiAgc2ltX21heGVzIDwtIHVubGlzdChsYXBwbHkoY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKQogIHR0ZXN0X3B2YWxfY2lzIDwtIGNiaW5kKHR0ZXN0X3B2YWxfY2lzLHQudGVzdCh4ID0gdW5saXN0KGxhcHBseShjaXNfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkseSA9IHVubGlzdChsYXBwbHkoY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwgYWx0ZXJuYXRpdmUgPSAnZ3JlYXRlcicpJHAudmFsdWUpCn0KCiMgU2F2ZSBvdXRwdXRzCnNhdmUoY2lzX2xpbl9jbHVzdF9saXN0LCBjaXNfbGluX2NsdXN0X3JhbmRfbGlzdCx6X21lYW5fY2lzLHB2YWxfbWVhbl9jaXMsIHpfd21lYW5fY2lzLCB0dGVzdF9wdmFsX2NpcywgZmlsZSA9ICcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vY2lzX3NpbV9yZXN1bHRzLlJEYXRhJykKcm0oY2lzKQpgYGAKCgojIExvb2sgYXQgd2hldGhlciBsaW5lYWdlcyBjbHVzdGVyIHRvZ2V0aGVyIGluIGVhY2ggaW5kaXZpZHVhbCBjb25kaXRpb24gLSBTdGFydGluZyB3aXRoIGNpc3RvY2lzCmBgYHtyfQpJZGVudHMoYWxsX2RhdGEpIDwtIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiAjIENoYW5nZSB0aGUgaWRlbnRzIHRvIHRoZSBPRyBjb25kaXRpb24gZm9yIHN1YnNldHRpbmcgdG8gY2lzdG9jaXMKY2lzdG9jaXMgPC0gc3Vic2V0KGFsbF9kYXRhLCBpZGVudHMgPSAnY2lzdG9jaXMnKSAjIFN1YnNldCBkb3duIHRvIHRoZSBjaXN0b2NpcyBvYmplY3QKCkVsYm93UGxvdChjaXN0b2NpcykgIyBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIHNlZW1zIHRvIHJlYWxseSBsZXZlbCBvZmYgYXQgMTAKCiMgUmVjbHVzdGVyIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBkaW1lbnNpb25zCmNpc3RvY2lzIDwtIEZpbmROZWlnaGJvcnMoY2lzdG9jaXMsIGRpbXMgPSAxOjEwKQpjaXN0b2NpcyA8LSBGaW5kQ2x1c3RlcnMoY2lzdG9jaXMsIHJlc29sdXRpb24gPSAwLjUpCmNpc3RvY2lzIDwtIFJ1blVNQVAoY2lzdG9jaXMsIGRpbXMgPSAxOjEwKQpEaW1QbG90KGNpc3RvY2lzLCByZWR1Y3Rpb24gPSAndW1hcCcpCgojIEJ1aWxkIGxpc3Qgb2YgbGluZWFnZXMgd2l0aCBhdCBsZWFzdCA1IGNlbGxzIGluIGRhYiB0cmFtIGFuZCBjaGVjayB3aGF0IHNldXJhdCBjbHVzdGVyIHRoZSBjZWxscyBhcmUgaW4gCmNpc3RvY2lzX2xpbl9jbHVzdF9saXN0IDwtIGxpc3QoKQoKZm9yIChpIGluIGZpdmVjZWxsX2NETkEkQ2lzdG9DaXMpewogIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShJZGVudHMoY2lzdG9jaXMpW2Npc3RvY2lzJExpbmVhZ2UgPT0gaV0pKQogIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgY2lzdG9jaXNfbGluX2NsdXN0X2xpc3RbW2ldXSA8LSB0ZW1wX2RmCn0KCiMgTmVlZCB0byBkbyBhIHJhbmRvbSBzYW1wbGluZyBvZiB0aGUgc2FtZSB0aGluZyAKY2lzdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdCA8LSBsaXN0KCkKbnVtX2l0ZXIgPC0gODAwIApmb3IoaiBpbiAxOm51bV9pdGVyKXsKICBzZXQuc2VlZChqKQogIGNpc3RvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXSA8LSBsaXN0KCkKICBmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSRDaXN0b0Npcyl7CiAgICBudW1fY2VsbHMgPC0gbGVuZ3RoKGNpc3RvY2lzJExpbmVhZ2VbY2lzdG9jaXMkTGluZWFnZSA9PSBpXSkKICAgIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShzYW1wbGUoSWRlbnRzKGNpc3RvY2lzKSwgbnVtX2NlbGxzLCByZXBsYWNlID0gRikpKQogICAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogICAgY2lzdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbal1dW1tpXV0gPC0gdGVtcF9kZgogIH0KfQpgYGAKIyBTaWduaWZpY2FuY2UgdGVzdGluZyBvZiB0aGUgY2lzdG9jaXMgc2ltdWxhdGlvbgpgYGB7cn0KIyBGaW5kIHRoZSBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24KbWVhbl9jaXN0b2NpcyA8LSBtZWFuKHVubGlzdChsYXBwbHkoY2lzdG9jaXNfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpCm1lYW5zX2Npc3RvY2lzX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoY2lzdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgbWVhbih1bmxpc3QobGFwcGx5KGNpc3RvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSkpCnpfbWVhbl9jaXN0b2NpcyA8LSAobWVhbl9jaXN0b2Npcy1tZWFuKG1lYW5zX2Npc3RvY2lzX3NpbSkpL3NkKG1lYW5zX2Npc3RvY2lzX3NpbSkKcHZhbF9tZWFuX2Npc3RvY2lzIDwtIHBub3JtKHpfbWVhbl9jaXN0b2NpcywgbWVhbihtZWFuc19jaXN0b2Npc19zaW0pLCBzZChtZWFuc19jaXN0b2Npc19zaW0pLCBsb3dlci50YWlsID0gRikKCiMgRmluZCB0aGUgd2VpZ2h0ZWQgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCndlaWdodGVkX21lYW5fY2lzdG9jaXMgPC0gd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNpc3RvY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAp1bmxpc3QobGFwcGx5KGNpc3RvY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCndlaWdodGVkX21lYW5zX2Npc3RvY2lzX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoY2lzdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNpc3RvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY2lzdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpKQp6X3dtZWFuX2Npc3RvY2lzIDwtICh3ZWlnaHRlZF9tZWFuX2Npc3RvY2lzLW1lYW4od2VpZ2h0ZWRfbWVhbnNfY2lzdG9jaXNfc2ltKSkvc2Qod2VpZ2h0ZWRfbWVhbnNfY2lzdG9jaXNfc2ltKQpwdmFsX3dtZWFuX2Npc3RvY2lzIDwtIHBub3JtKHpfd21lYW5fY2lzdG9jaXMsIG1lYW4od2VpZ2h0ZWRfbWVhbnNfY2lzdG9jaXNfc2ltKSwgc2Qod2VpZ2h0ZWRfbWVhbnNfY2lzdG9jaXNfc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIENvbXBhcmUgZWFjaCBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbiBvZiBtYXhlcyB0byB0aGUgb2JzZXJ2ZWQgbWF4IGJ5IHQgdGVzdCBhbmQgdHJhY2sgcHZhbAp0dGVzdF9wdmFsX2Npc3RvY2lzIDwtIGMoKQpmb3IgKGkgaW4gMTpsZW5ndGgobWVhbnNfY2lzdG9jaXNfc2ltKSl7CiAgc2ltX21heGVzIDwtIHVubGlzdChsYXBwbHkoY2lzdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpCiAgdHRlc3RfcHZhbF9jaXN0b2NpcyA8LSBjYmluZCh0dGVzdF9wdmFsX2Npc3RvY2lzLHQudGVzdCh4ID0gdW5saXN0KGxhcHBseShjaXN0b2Npc19saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSx5ID0gdW5saXN0KGxhcHBseShjaXN0b2Npc19saW5fY2x1c3RfcmFuZF9saXN0W1tpXV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksIGFsdGVybmF0aXZlID0gJ2dyZWF0ZXInKSRwLnZhbHVlKQp9CgojIFNhdmUgb3V0cHV0cwpzYXZlKGNpc3RvY2lzX2xpbl9jbHVzdF9saXN0LCBjaXN0b2Npc19saW5fY2x1c3RfcmFuZF9saXN0LHpfbWVhbl9jaXN0b2NpcyxwdmFsX21lYW5fY2lzdG9jaXMsIHpfd21lYW5fY2lzdG9jaXMsIHR0ZXN0X3B2YWxfY2lzdG9jaXMsIGZpbGUgPSAnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL2Npc3RvY2lzX3NpbV9yZXN1bHRzLlJEYXRhJykKcm0oY2lzdG9jaXMpCmBgYAoKCiMgTG9vayBhdCB3aGV0aGVyIGxpbmVhZ2VzIGNsdXN0ZXIgdG9nZXRoZXIgaW4gZWFjaCBpbmRpdmlkdWFsIGNvbmRpdGlvbiAtIFN0YXJ0aW5nIHdpdGggY2lzdG9kYWJ0cmFtCmBgYHtyfQpJZGVudHMoYWxsX2RhdGEpIDwtIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiAjIENoYW5nZSB0aGUgaWRlbnRzIHRvIHRoZSBPRyBjb25kaXRpb24gZm9yIHN1YnNldHRpbmcgdG8gY2lzdG9kYWJ0cmFtCmNpc3RvZGFidHJhbSA8LSBzdWJzZXQoYWxsX2RhdGEsIGlkZW50cyA9ICdjaXN0b2RhYnRyYW0nKSAjIFN1YnNldCBkb3duIHRvIHRoZSBjaXN0b2RhYnRyYW0gb2JqZWN0CgpFbGJvd1Bsb3QoY2lzdG9kYWJ0cmFtKSAjIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gc2VlbXMgdG8gcmVhbGx5IGxldmVsIG9mZiBhdCAxMAoKIyBSZWNsdXN0ZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMKY2lzdG9kYWJ0cmFtIDwtIEZpbmROZWlnaGJvcnMoY2lzdG9kYWJ0cmFtLCBkaW1zID0gMToxMCkKY2lzdG9kYWJ0cmFtIDwtIEZpbmRDbHVzdGVycyhjaXN0b2RhYnRyYW0sIHJlc29sdXRpb24gPSAwLjUpCmNpc3RvZGFidHJhbSA8LSBSdW5VTUFQKGNpc3RvZGFidHJhbSwgZGltcyA9IDE6MTApCkRpbVBsb3QoY2lzdG9kYWJ0cmFtLCByZWR1Y3Rpb24gPSAndW1hcCcpCgojIEJ1aWxkIGxpc3Qgb2YgbGluZWFnZXMgd2l0aCBhdCBsZWFzdCA1IGNlbGxzIGluIGRhYiB0cmFtIGFuZCBjaGVjayB3aGF0IHNldXJhdCBjbHVzdGVyIHRoZSBjZWxscyBhcmUgaW4gCmNpc3RvZGFidHJhbV9saW5fY2x1c3RfbGlzdCA8LSBsaXN0KCkKCmZvciAoaSBpbiBmaXZlY2VsbF9jRE5BJENpc3RvRGFiVHJhbSl7CiAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKElkZW50cyhjaXN0b2RhYnRyYW0pW2Npc3RvZGFidHJhbSRMaW5lYWdlID09IGldKSkKICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogIGNpc3RvZGFidHJhbV9saW5fY2x1c3RfbGlzdFtbaV1dIDwtIHRlbXBfZGYKfQoKIyBOZWVkIHRvIGRvIGEgcmFuZG9tIHNhbXBsaW5nIG9mIHRoZSBzYW1lIHRoaW5nIApjaXN0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCA8LSBsaXN0KCkKbnVtX2l0ZXIgPC0gODAwIApmb3IoaiBpbiAxOm51bV9pdGVyKXsKICBzZXQuc2VlZChqKQogIGNpc3RvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1tqXV0gPC0gbGlzdCgpCiAgZm9yIChpIGluIGZpdmVjZWxsX2NETkEkQ2lzdG9EYWJUcmFtKXsKICAgIG51bV9jZWxscyA8LSBsZW5ndGgoY2lzdG9kYWJ0cmFtJExpbmVhZ2VbY2lzdG9kYWJ0cmFtJExpbmVhZ2UgPT0gaV0pCiAgICB0ZW1wX2RmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoc2FtcGxlKElkZW50cyhjaXN0b2RhYnRyYW0pLCBudW1fY2VsbHMsIHJlcGxhY2UgPSBGKSkpCiAgICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICAgIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgICBjaXN0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbal1dW1tpXV0gPC0gdGVtcF9kZgogIH0KfQpgYGAKIyBTaWduaWZpY2FuY2UgdGVzdGluZyBvZiB0aGUgY2lzdG9kYWJ0cmFtIHNpbXVsYXRpb24KYGBge3J9CiMgRmluZCB0aGUgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCm1lYW5fY2lzdG9kYWJ0cmFtIDwtIG1lYW4odW5saXN0KGxhcHBseShjaXN0b2RhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpCm1lYW5zX2Npc3RvZGFidHJhbV9zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGNpc3RvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0KSwgZnVuY3Rpb24oeSkKICBtZWFuKHVubGlzdChsYXBwbHkoY2lzdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSkpCnpfbWVhbl9jaXN0b2RhYnRyYW0gPC0gKG1lYW5fY2lzdG9kYWJ0cmFtLW1lYW4obWVhbnNfY2lzdG9kYWJ0cmFtX3NpbSkpL3NkKG1lYW5zX2Npc3RvZGFidHJhbV9zaW0pCnB2YWxfbWVhbl9jaXN0b2RhYnRyYW0gPC0gcG5vcm0oel9tZWFuX2Npc3RvZGFidHJhbSwgbWVhbihtZWFuc19jaXN0b2RhYnRyYW1fc2ltKSwgc2QobWVhbnNfY2lzdG9kYWJ0cmFtX3NpbSksIGxvd2VyLnRhaWwgPSBGKQoKIyBGaW5kIHRoZSB3ZWlnaHRlZCBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24Kd2VpZ2h0ZWRfbWVhbl9jaXN0b2RhYnRyYW0gPC0gd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNpc3RvZGFidHJhbV9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKdW5saXN0KGxhcHBseShjaXN0b2RhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkKd2VpZ2h0ZWRfbWVhbnNfY2lzdG9kYWJ0cmFtX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoY2lzdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjaXN0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAogICAgICAgICAgICAgICAgdW5saXN0KGxhcHBseShjaXN0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpKQp6X3dtZWFuX2Npc3RvZGFidHJhbSA8LSAod2VpZ2h0ZWRfbWVhbl9jaXN0b2RhYnRyYW0tbWVhbih3ZWlnaHRlZF9tZWFuc19jaXN0b2RhYnRyYW1fc2ltKSkvc2Qod2VpZ2h0ZWRfbWVhbnNfY2lzdG9kYWJ0cmFtX3NpbSkKcHZhbF93bWVhbl9jaXN0b2RhYnRyYW0gPC0gcG5vcm0oel93bWVhbl9jaXN0b2RhYnRyYW0sIG1lYW4od2VpZ2h0ZWRfbWVhbnNfY2lzdG9kYWJ0cmFtX3NpbSksIHNkKHdlaWdodGVkX21lYW5zX2Npc3RvZGFidHJhbV9zaW0pLCBsb3dlci50YWlsID0gRikKCiMgQ29tcGFyZSBlYWNoIGluZGl2aWR1YWwgZGlzdHJpYnV0aW9uIG9mIG1heGVzIHRvIHRoZSBvYnNlcnZlZCBtYXggYnkgdCB0ZXN0IGFuZCB0cmFjayBwdmFsCnR0ZXN0X3B2YWxfY2lzdG9kYWJ0cmFtIDwtIGMoKQpmb3IgKGkgaW4gMTpsZW5ndGgobWVhbnNfY2lzdG9kYWJ0cmFtX3NpbSkpewogIHNpbV9tYXhlcyA8LSB1bmxpc3QobGFwcGx5KGNpc3RvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1tpXV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkKICB0dGVzdF9wdmFsX2Npc3RvZGFidHJhbSA8LSBjYmluZCh0dGVzdF9wdmFsX2Npc3RvZGFidHJhbSx0LnRlc3QoeCA9IHVubGlzdChsYXBwbHkoY2lzdG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLHkgPSB1bmxpc3QobGFwcGx5KGNpc3RvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1tpXV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksIGFsdGVybmF0aXZlID0gJ2dyZWF0ZXInKSRwLnZhbHVlKQp9CgojIFNhdmUgb3V0cHV0cwpzYXZlKGNpc3RvZGFidHJhbV9saW5fY2x1c3RfbGlzdCwgY2lzdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3Qsel9tZWFuX2Npc3RvZGFidHJhbSxwdmFsX21lYW5fY2lzdG9kYWJ0cmFtLCB6X3dtZWFuX2Npc3RvZGFidHJhbSwgdHRlc3RfcHZhbF9jaXN0b2RhYnRyYW0sIGZpbGUgPSAnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL2Npc3RvZGFidHJhbV9zaW1fcmVzdWx0cy5SRGF0YScpCnJtKGNpc3RvZGFidHJhbSkKYGBgCgojIExvb2sgYXQgd2hldGhlciBsaW5lYWdlcyBjbHVzdGVyIHRvZ2V0aGVyIGluIGVhY2ggaW5kaXZpZHVhbCBjb25kaXRpb24gLSBTdGFydGluZyB3aXRoIGNpc3RvY29jbDIKYGBge3J9CklkZW50cyhhbGxfZGF0YSkgPC0gYWxsX2RhdGEkT0dfY29uZGl0aW9uICMgQ2hhbmdlIHRoZSBpZGVudHMgdG8gdGhlIE9HIGNvbmRpdGlvbiBmb3Igc3Vic2V0dGluZyB0byBjaXN0b2NvY2wyCmNpc3RvY29jbDIgPC0gc3Vic2V0KGFsbF9kYXRhLCBpZGVudHMgPSAnY2lzdG9jb2NsMicpICMgU3Vic2V0IGRvd24gdG8gdGhlIGNpc3RvY29jbDIgb2JqZWN0CgpFbGJvd1Bsb3QoY2lzdG9jb2NsMikgIyBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIHNlZW1zIHRvIHJlYWxseSBsZXZlbCBvZmYgYXQgMTAKCiMgUmVjbHVzdGVyIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBkaW1lbnNpb25zCmNpc3RvY29jbDIgPC0gRmluZE5laWdoYm9ycyhjaXN0b2NvY2wyLCBkaW1zID0gMToxMCkKY2lzdG9jb2NsMiA8LSBGaW5kQ2x1c3RlcnMoY2lzdG9jb2NsMiwgcmVzb2x1dGlvbiA9IDAuNSkKY2lzdG9jb2NsMiA8LSBSdW5VTUFQKGNpc3RvY29jbDIsIGRpbXMgPSAxOjEwKQpEaW1QbG90KGNpc3RvY29jbDIsIHJlZHVjdGlvbiA9ICd1bWFwJykKCiMgQnVpbGQgbGlzdCBvZiBsaW5lYWdlcyB3aXRoIGF0IGxlYXN0IDUgY2VsbHMgaW4gZGFiIHRyYW0gYW5kIGNoZWNrIHdoYXQgc2V1cmF0IGNsdXN0ZXIgdGhlIGNlbGxzIGFyZSBpbiAKY2lzdG9jb2NsMl9saW5fY2x1c3RfbGlzdCA8LSBsaXN0KCkKCmZvciAoaSBpbiBmaXZlY2VsbF9jRE5BJENpc3RvQ29DbDIpewogIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShJZGVudHMoY2lzdG9jb2NsMilbY2lzdG9jb2NsMiRMaW5lYWdlID09IGldKSkKICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogIGNpc3RvY29jbDJfbGluX2NsdXN0X2xpc3RbW2ldXSA8LSB0ZW1wX2RmCn0KCiMgTmVlZCB0byBkbyBhIHJhbmRvbSBzYW1wbGluZyBvZiB0aGUgc2FtZSB0aGluZyAKY2lzdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0IDwtIGxpc3QoKQpudW1faXRlciA8LSA4MDAgCmZvcihqIGluIDE6bnVtX2l0ZXIpewogIHNldC5zZWVkKGopCiAgY2lzdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1tqXV0gPC0gbGlzdCgpCiAgZm9yIChpIGluIGZpdmVjZWxsX2NETkEkQ2lzdG9Db0NsMil7CiAgICBudW1fY2VsbHMgPC0gbGVuZ3RoKGNpc3RvY29jbDIkTGluZWFnZVtjaXN0b2NvY2wyJExpbmVhZ2UgPT0gaV0pCiAgICB0ZW1wX2RmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoc2FtcGxlKElkZW50cyhjaXN0b2NvY2wyKSwgbnVtX2NlbGxzLCByZXBsYWNlID0gRikpKQogICAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogICAgY2lzdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1tqXV1bW2ldXSA8LSB0ZW1wX2RmCiAgfQp9CmBgYAojIFNpZ25pZmljYW5jZSB0ZXN0aW5nIG9mIHRoZSBjaXN0b2NvY2wyIHNpbXVsYXRpb24KYGBge3J9CiMgRmluZCB0aGUgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCm1lYW5fY2lzdG9jb2NsMiA8LSBtZWFuKHVubGlzdChsYXBwbHkoY2lzdG9jb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSkKbWVhbnNfY2lzdG9jb2NsMl9zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGNpc3RvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgbWVhbih1bmxpc3QobGFwcGx5KGNpc3RvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKSkKel9tZWFuX2Npc3RvY29jbDIgPC0gKG1lYW5fY2lzdG9jb2NsMi1tZWFuKG1lYW5zX2Npc3RvY29jbDJfc2ltKSkvc2QobWVhbnNfY2lzdG9jb2NsMl9zaW0pCnB2YWxfbWVhbl9jaXN0b2NvY2wyIDwtIHBub3JtKHpfbWVhbl9jaXN0b2NvY2wyLCBtZWFuKG1lYW5zX2Npc3RvY29jbDJfc2ltKSwgc2QobWVhbnNfY2lzdG9jb2NsMl9zaW0pLCBsb3dlci50YWlsID0gRikKCiMgRmluZCB0aGUgd2VpZ2h0ZWQgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCndlaWdodGVkX21lYW5fY2lzdG9jb2NsMiA8LSB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoY2lzdG9jb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKdW5saXN0KGxhcHBseShjaXN0b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCndlaWdodGVkX21lYW5zX2Npc3RvY29jbDJfc2ltIDwtIHNhcHBseSgxOmxlbmd0aChjaXN0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjaXN0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY2lzdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkpCnpfd21lYW5fY2lzdG9jb2NsMiA8LSAod2VpZ2h0ZWRfbWVhbl9jaXN0b2NvY2wyLW1lYW4od2VpZ2h0ZWRfbWVhbnNfY2lzdG9jb2NsMl9zaW0pKS9zZCh3ZWlnaHRlZF9tZWFuc19jaXN0b2NvY2wyX3NpbSkKcHZhbF93bWVhbl9jaXN0b2NvY2wyIDwtIHBub3JtKHpfd21lYW5fY2lzdG9jb2NsMiwgbWVhbih3ZWlnaHRlZF9tZWFuc19jaXN0b2NvY2wyX3NpbSksIHNkKHdlaWdodGVkX21lYW5zX2Npc3RvY29jbDJfc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIENvbXBhcmUgZWFjaCBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbiBvZiBtYXhlcyB0byB0aGUgb2JzZXJ2ZWQgbWF4IGJ5IHQgdGVzdCBhbmQgdHJhY2sgcHZhbAp0dGVzdF9wdmFsX2Npc3RvY29jbDIgPC0gYygpCmZvciAoaSBpbiAxOmxlbmd0aChtZWFuc19jaXN0b2NvY2wyX3NpbSkpewogIHNpbV9tYXhlcyA8LSB1bmxpc3QobGFwcGx5KGNpc3RvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpCiAgdHRlc3RfcHZhbF9jaXN0b2NvY2wyIDwtIGNiaW5kKHR0ZXN0X3B2YWxfY2lzdG9jb2NsMix0LnRlc3QoeCA9IHVubGlzdChsYXBwbHkoY2lzdG9jb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSx5ID0gdW5saXN0KGxhcHBseShjaXN0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwgYWx0ZXJuYXRpdmUgPSAnZ3JlYXRlcicpJHAudmFsdWUpCn0KCiMgU2F2ZSBvdXRwdXRzCnNhdmUoY2lzdG9jb2NsMl9saW5fY2x1c3RfbGlzdCwgY2lzdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0LHpfbWVhbl9jaXN0b2NvY2wyLHB2YWxfbWVhbl9jaXN0b2NvY2wyLCB6X3dtZWFuX2Npc3RvY29jbDIsIHR0ZXN0X3B2YWxfY2lzdG9jb2NsMiwgZmlsZSA9ICcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vY2lzdG9jb2NsMl9zaW1fcmVzdWx0cy5SRGF0YScpCnJtKGNpc3RvY29jbDIpCmBgYAoKIyBCdWlsZCBkYXRhZnJhbWUgb2Ygb3ZlcmFsbCBzaW11bGF0aW9uIHJlc3VsdHMKYGBge3J9CnNpbV9yZXN1bHRzIDwtIHJiaW5kKAogIGRhYnRyYW0gPC0gZGF0YS5mcmFtZSgiTWVhbl9ac2NvcmUiID0gel9tZWFuX2RhYnRyYW0sICJNZWFuX3B2YWwiID0gcHZhbF9tZWFuX2RhYnRyYW0sICJXZWlnaHRlZF9NZWFuX1pzY29yZSIgPSB6X3dtZWFuX2RhYnRyYW0sICJXZWlnaHRlZF9NZWFuX3B2YWwiID0gcHZhbF93bWVhbl9kYWJ0cmFtLCB0dGVzdF9zaW1zX3NpZyA9IHN1bSh0dGVzdF9wdmFsX2RhYnRyYW0gPD0gMC4wNSkpLAogIGRhYnRyYW10b2RhYnRyYW0gPC0gZGF0YS5mcmFtZSgiTWVhbl9ac2NvcmUiID0gel9tZWFuX2RhYnRyYW10b2RhYnRyYW0sICJNZWFuX3B2YWwiID0gcHZhbF9tZWFuX2RhYnRyYW10b2RhYnRyYW0sICJXZWlnaHRlZF9NZWFuX1pzY29yZSIgPSB6X3dtZWFuX2RhYnRyYW10b2RhYnRyYW0sICJXZWlnaHRlZF9NZWFuX3B2YWwiID0gcHZhbF93bWVhbl9kYWJ0cmFtdG9kYWJ0cmFtLCB0dGVzdF9zaW1zX3NpZyA9IHN1bSh0dGVzdF9wdmFsX2RhYnRyYW10b2RhYnRyYW0gPD0gMC4wNSkpLAogIGRhYnRyYW10b2NvY2wyIDwtIGRhdGEuZnJhbWUoIk1lYW5fWnNjb3JlIiA9IHpfbWVhbl9kYWJ0cmFtdG9jb2NsMiwgIk1lYW5fcHZhbCIgPSBwdmFsX21lYW5fZGFidHJhbXRvY29jbDIsICJXZWlnaHRlZF9NZWFuX1pzY29yZSIgPSB6X3dtZWFuX2RhYnRyYW10b2NvY2wyLCAiV2VpZ2h0ZWRfTWVhbl9wdmFsIiA9IHB2YWxfd21lYW5fZGFidHJhbXRvY29jbDIsIHR0ZXN0X3NpbXNfc2lnID0gc3VtKHR0ZXN0X3B2YWxfZGFidHJhbXRvY29jbDIgPD0gMC4wNSkpLAogIGRhYnRyYW10b2NpcyA8LSBkYXRhLmZyYW1lKCJNZWFuX1pzY29yZSIgPSB6X21lYW5fZGFidHJhbXRvY2lzLCAiTWVhbl9wdmFsIiA9IHB2YWxfbWVhbl9kYWJ0cmFtdG9jaXMsICJXZWlnaHRlZF9NZWFuX1pzY29yZSIgPSB6X3dtZWFuX2RhYnRyYW10b2NpcywgIldlaWdodGVkX01lYW5fcHZhbCIgPSBwdmFsX3dtZWFuX2RhYnRyYW10b2NpcywgdHRlc3Rfc2ltc19zaWcgPSBzdW0odHRlc3RfcHZhbF9kYWJ0cmFtdG9jaXMgPD0gMC4wNSkpLAogIGNpcyA8LSBkYXRhLmZyYW1lKCJNZWFuX1pzY29yZSIgPSB6X21lYW5fY2lzLCAiTWVhbl9wdmFsIiA9IHB2YWxfbWVhbl9jaXMsICJXZWlnaHRlZF9NZWFuX1pzY29yZSIgPSB6X3dtZWFuX2NpcywgIldlaWdodGVkX01lYW5fcHZhbCIgPSBwdmFsX3dtZWFuX2NpcywgdHRlc3Rfc2ltc19zaWcgPSBzdW0odHRlc3RfcHZhbF9jaXMgPD0gMC4wNSkpLAogIGNpc3RvZGFidHJhbSA8LSBkYXRhLmZyYW1lKCJNZWFuX1pzY29yZSIgPSB6X21lYW5fY2lzdG9kYWJ0cmFtLCAiTWVhbl9wdmFsIiA9IHB2YWxfbWVhbl9jaXN0b2RhYnRyYW0sICJXZWlnaHRlZF9NZWFuX1pzY29yZSIgPSB6X3dtZWFuX2Npc3RvZGFidHJhbSwgIldlaWdodGVkX01lYW5fcHZhbCIgPSBwdmFsX3dtZWFuX2Npc3RvZGFidHJhbSwgdHRlc3Rfc2ltc19zaWcgPSBzdW0odHRlc3RfcHZhbF9jaXN0b2RhYnRyYW0gPD0gMC4wNSkpLAogIGNpc3RvY29jbDIgPC0gZGF0YS5mcmFtZSgiTWVhbl9ac2NvcmUiID0gel9tZWFuX2Npc3RvY29jbDIsICJNZWFuX3B2YWwiID0gcHZhbF9tZWFuX2Npc3RvY29jbDIsICJXZWlnaHRlZF9NZWFuX1pzY29yZSIgPSB6X3dtZWFuX2Npc3RvY29jbDIsICJXZWlnaHRlZF9NZWFuX3B2YWwiID0gcHZhbF93bWVhbl9jaXN0b2NvY2wyLCB0dGVzdF9zaW1zX3NpZyA9IHN1bSh0dGVzdF9wdmFsX2Npc3RvY29jbDIgPD0gMC4wNSkpLAogIGNpc3RvY2lzIDwtIGRhdGEuZnJhbWUoIk1lYW5fWnNjb3JlIiA9IHpfbWVhbl9jaXN0b2NpcywgIk1lYW5fcHZhbCIgPSBwdmFsX21lYW5fY2lzdG9jaXMsICJXZWlnaHRlZF9NZWFuX1pzY29yZSIgPSB6X3dtZWFuX2Npc3RvY2lzLCAiV2VpZ2h0ZWRfTWVhbl9wdmFsIiA9IHB2YWxfd21lYW5fY2lzdG9jaXMsIHR0ZXN0X3NpbXNfc2lnID0gc3VtKHR0ZXN0X3B2YWxfY2lzdG9jaXMgPD0gMC4wNSkpLAogIGNvY2wyIDwtIGRhdGEuZnJhbWUoIk1lYW5fWnNjb3JlIiA9IHpfbWVhbl9jb2NsMiwgIk1lYW5fcHZhbCIgPSBwdmFsX21lYW5fY29jbDIsICJXZWlnaHRlZF9NZWFuX1pzY29yZSIgPSB6X3dtZWFuX2NvY2wyLCAiV2VpZ2h0ZWRfTWVhbl9wdmFsIiA9IHB2YWxfd21lYW5fY29jbDIsIHR0ZXN0X3NpbXNfc2lnID0gc3VtKHR0ZXN0X3B2YWxfY29jbDIgPD0gMC4wNSkpLAogIGNvY2wydG9kYWJ0cmFtIDwtIGRhdGEuZnJhbWUoIk1lYW5fWnNjb3JlIiA9IHpfbWVhbl9jb2NsMnRvZGFidHJhbSwgIk1lYW5fcHZhbCIgPSBwdmFsX21lYW5fY29jbDJ0b2RhYnRyYW0sICJXZWlnaHRlZF9NZWFuX1pzY29yZSIgPSB6X3dtZWFuX2NvY2wydG9kYWJ0cmFtLCAiV2VpZ2h0ZWRfTWVhbl9wdmFsIiA9IHB2YWxfd21lYW5fY29jbDJ0b2RhYnRyYW0sIHR0ZXN0X3NpbXNfc2lnID0gc3VtKHR0ZXN0X3B2YWxfY29jbDJ0b2RhYnRyYW0gPD0gMC4wNSkpLAogIGNvY2wydG9jb2NsMiA8LSBkYXRhLmZyYW1lKCJNZWFuX1pzY29yZSIgPSB6X21lYW5fY29jbDJ0b2NvY2wyLCAiTWVhbl9wdmFsIiA9IHB2YWxfbWVhbl9jb2NsMnRvY29jbDIsICJXZWlnaHRlZF9NZWFuX1pzY29yZSIgPSB6X3dtZWFuX2NvY2wydG9jb2NsMiwgIldlaWdodGVkX01lYW5fcHZhbCIgPSBwdmFsX3dtZWFuX2NvY2wydG9jb2NsMiwgdHRlc3Rfc2ltc19zaWcgPSBzdW0odHRlc3RfcHZhbF9jb2NsMnRvY29jbDIgPD0gMC4wNSkpLAogIGNvY2wydG9jaXMgPC0gZGF0YS5mcmFtZSgiTWVhbl9ac2NvcmUiID0gel9tZWFuX2NvY2wydG9jaXMsICJNZWFuX3B2YWwiID0gcHZhbF9tZWFuX2NvY2wydG9jaXMsICJXZWlnaHRlZF9NZWFuX1pzY29yZSIgPSB6X3dtZWFuX2NvY2wydG9jaXMsICJXZWlnaHRlZF9NZWFuX3B2YWwiID0gcHZhbF93bWVhbl9jb2NsMnRvY2lzLCB0dGVzdF9zaW1zX3NpZyA9IHN1bSh0dGVzdF9wdmFsX2NvY2wydG9jaXMgPD0gMC4wNSkpCikKCnJvd25hbWVzKHNpbV9yZXN1bHRzKSA8LSBjKCJkYWJ0cmFtIiwgImRhYnRyYW10b2RhYnRyYW0iLCAiZGFidHJhbXRvY29jbDIiLCAiZGFidHJhbXRvY2lzIiwgImNpcyIsICJjaXN0b2RhYnRyYW0iLCAiY2lzdG9jb2NsMiIsICJjaXN0b2NpcyIsICJjb2NsMiIsICJjb2NsMnRvZGFidHJhbSIsICJjb2NsMnRvY29jbDIiLCAiY29jbDJ0b2NpcyIpCgp3cml0ZS5jc3Yoc2ltX3Jlc3VsdHMsICcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vc2ltX3Jlc3VsdHMuY3N2Jywgcm93Lm5hbWVzID0gVCkgCmBgYAoKIyBMb2FkIHNpbXVsYXRpb24gZGF0YSBiYWNrIGluCmBgYHtyfQpzaW1fcmVzdWx0cyA8LSByZWFkLmNzdignMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL3NpbV9yZXN1bHRzLmNzdicpCmxvYWQoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9kYWJ0cmFtX3NpbV9yZXN1bHRzLlJEYXRhJykKbG9hZCgnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL2RhYnRyYW10b2RhYnRyYW1fc2ltX3Jlc3VsdHMuUkRhdGEnKQpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vZGFidHJhbXRvY29jbDJfc2ltX3Jlc3VsdHMuUkRhdGEnKQpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vZGFidHJhbXRvY2lzX3NpbV9yZXN1bHRzLlJEYXRhJykKbG9hZCgnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL2NvY2wyX3NpbV9yZXN1bHRzLlJEYXRhJykKbG9hZCgnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL2NvY2wydG9kYWJ0cmFtX3NpbV9yZXN1bHRzLlJEYXRhJykKbG9hZCgnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL2NvY2wydG9jb2NsMl9zaW1fcmVzdWx0cy5SRGF0YScpCmxvYWQoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9jb2NsMnRvY2lzX3NpbV9yZXN1bHRzLlJEYXRhJykKbG9hZCgnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL2Npc19zaW1fcmVzdWx0cy5SRGF0YScpCmxvYWQoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9jaXN0b2RhYnRyYW1fc2ltX3Jlc3VsdHMuUkRhdGEnKQpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vY2lzdG9jb2NsMl9zaW1fcmVzdWx0cy5SRGF0YScpCmxvYWQoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9jaXN0b2Npc19zaW1fcmVzdWx0cy5SRGF0YScpCgpgYGAKCiMgUGxvdCBoZWF0bWFwcyBvZiB0cnVlIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgcGVyIGxpbmVhZ2UgaW4gZWFjaCBjbHVzdGVyIHZzIHJhbmRvbSBzaW11bGF0aW9ucwpgYGB7cn0KCmJyZWFrcyA8LSBzZXEoMCwgMSwgMC4xKQoKIyBEYWJUcmFtCnBkZignMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL3Byb3BvcnRpb25fY2x1c3RlcnNfaGVhdG1hcHMucGRmJywgd2lkdGggPSAxNikKZGFidHJhbV9wY250cyA8LSBhcy5kYXRhLmZyYW1lKHNhcHBseShkYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCAnW1snLCAzKSkKY2VsbF9udW1zIDwtIHNhcHBseShkYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKQpyb3duYW1lcyhkYWJ0cmFtX3BjbnRzKSA8LSBjKCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IikKY29sbmFtZXMoZGFidHJhbV9wY250cykgPC0gcGFzdGUobmFtZXMoY2VsbF9udW1zKSwgcmVwKCctJyxsZW5ndGgoY2VsbF9udW1zKSksIGNlbGxfbnVtcywgcmVwKCdjZWxscycsIGxlbmd0aChjZWxsX251bXMpKSkKcCA8LSBwaGVhdG1hcChkYWJ0cmFtX3BjbnRzLGNsdXN0ZXJfcm93cyA9IEYsIGNvbG9yID0gaW5mZXJubygxMSksIG1haW4gPSAiRGFiVHJhbSIsIGJyZWFrcyA9IGJyZWFrcykgIyAKcAoKZGFidHJhbV9wY250c19yYW5kIDwtIGFzLmRhdGEuZnJhbWUoUmVkdWNlKGArYCwgbGFwcGx5KGRhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCwgZnVuY3Rpb24oeCkgewogIHNhcHBseSh4LCBmdW5jdGlvbih5KSB5JFBjbnRfY2VsbHMpCn0pKS8gbGVuZ3RoKGRhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCkpCnJvd25hbWVzKGRhYnRyYW1fcGNudHNfcmFuZCkgPC0gYygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIpCmNvbG5hbWVzKGRhYnRyYW1fcGNudHNfcmFuZCkgPC0gcGFzdGUobmFtZXMoY2VsbF9udW1zKSwgcmVwKCctJyxsZW5ndGgoY2VsbF9udW1zKSksIGNlbGxfbnVtcywgcmVwKCdjZWxscycsIGxlbmd0aChjZWxsX251bXMpKSkKZGFidHJhbV9wY250c19yYW5kIDwtIGRhYnRyYW1fcGNudHNfcmFuZFsscCR0cmVlX2NvbCRvcmRlcl0KcGhlYXRtYXAoZGFidHJhbV9wY250c19yYW5kLGNsdXN0ZXJfcm93cyA9IEYsIGNvbG9yID0gaW5mZXJubygxMSksIG1haW4gPSAiRGFiVHJhbSBSYW5kIiwgYnJlYWtzID0gYnJlYWtzLCBjbHVzdGVyX2NvbHMgPSBGKQoKIyBEYWJUcmFtIHRvIERhYlRyYW0KZGFidHJhbXRvZGFidHJhbV9wY250cyA8LSBhcy5kYXRhLmZyYW1lKHNhcHBseShkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCAnW1snLCAzKSkKY2VsbF9udW1zIDwtIHNhcHBseShkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKQpyb3duYW1lcyhkYWJ0cmFtdG9kYWJ0cmFtX3BjbnRzKSA8LSBjKCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IikKY29sbmFtZXMoZGFidHJhbXRvZGFidHJhbV9wY250cykgPC0gcGFzdGUobmFtZXMoY2VsbF9udW1zKSwgcmVwKCctJyxsZW5ndGgoY2VsbF9udW1zKSksIGNlbGxfbnVtcywgcmVwKCdjZWxscycsIGxlbmd0aChjZWxsX251bXMpKSkKcCA8LSBwaGVhdG1hcChkYWJ0cmFtdG9kYWJ0cmFtX3BjbnRzLGNsdXN0ZXJfcm93cyA9IEYsIGNvbG9yID0gaW5mZXJubygxMSksIG1haW4gPSAiRGFiVHJhbSB0byBEYWJUcmFtIiwgYnJlYWtzID0gYnJlYWtzKQpwCgpkYWJ0cmFtdG9kYWJ0cmFtX3BjbnRzX3JhbmQgPC0gYXMuZGF0YS5mcmFtZShSZWR1Y2UoYCtgLCBsYXBwbHkoZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0LCBmdW5jdGlvbih4KSB7CiAgc2FwcGx5KHgsIGZ1bmN0aW9uKHkpIHkkUGNudF9jZWxscykKfSkpLyBsZW5ndGgoZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0KSkKcm93bmFtZXMoZGFidHJhbXRvZGFidHJhbV9wY250c19yYW5kKSA8LSBjKCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IikKY29sbmFtZXMoZGFidHJhbXRvZGFidHJhbV9wY250c19yYW5kKSA8LSBwYXN0ZShuYW1lcyhjZWxsX251bXMpLCByZXAoJy0nLGxlbmd0aChjZWxsX251bXMpKSwgY2VsbF9udW1zLCByZXAoJ2NlbGxzJywgbGVuZ3RoKGNlbGxfbnVtcykpKQpkYWJ0cmFtdG9kYWJ0cmFtX3BjbnRzX3JhbmQgPC0gZGFidHJhbXRvZGFidHJhbV9wY250c19yYW5kWyxwJHRyZWVfY29sJG9yZGVyXQpwaGVhdG1hcChkYWJ0cmFtdG9kYWJ0cmFtX3BjbnRzX3JhbmQsY2x1c3Rlcl9yb3dzID0gRiwgY29sb3IgPSBpbmZlcm5vKDExKSwgbWFpbiA9ICJEYWJUcmFtIHRvIERhYlRyYW0gUmFuZCIsIGJyZWFrcyA9IGJyZWFrcywgY2x1c3Rlcl9jb2xzID0gRikKCiMgRGFiVHJhbSB0byBDb0NsMgpkYWJ0cmFtdG9jb2NsMl9wY250cyA8LSBhcy5kYXRhLmZyYW1lKHNhcHBseShkYWJ0cmFtdG9jb2NsMl9saW5fY2x1c3RfbGlzdCwgJ1tbJywgMykpCmNlbGxfbnVtcyA8LSBzYXBwbHkoZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpCnJvd25hbWVzKGRhYnRyYW10b2NvY2wyX3BjbnRzKSA8LSBjKCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpCmNvbG5hbWVzKGRhYnRyYW10b2NvY2wyX3BjbnRzKSA8LSBwYXN0ZShuYW1lcyhjZWxsX251bXMpLCByZXAoJy0nLGxlbmd0aChjZWxsX251bXMpKSwgY2VsbF9udW1zLCByZXAoJ2NlbGxzJywgbGVuZ3RoKGNlbGxfbnVtcykpKQpwIDwtIHBoZWF0bWFwKGRhYnRyYW10b2NvY2wyX3BjbnRzLGNsdXN0ZXJfcm93cyA9IEYsIGNvbG9yID0gaW5mZXJubygxMSksIG1haW4gPSAiRGFiVHJhbSB0byBDb0NsMiIsIGJyZWFrcyA9IGJyZWFrcykKcAoKZGFidHJhbXRvY29jbDJfcGNudHNfcmFuZCA8LSBhcy5kYXRhLmZyYW1lKFJlZHVjZShgK2AsIGxhcHBseShkYWJ0cmFtdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0LCBmdW5jdGlvbih4KSB7CiAgc2FwcGx5KHgsIGZ1bmN0aW9uKHkpIHkkUGNudF9jZWxscykKfSkpLyBsZW5ndGgoZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCkpCnJvd25hbWVzKGRhYnRyYW10b2NvY2wyX3BjbnRzX3JhbmQpIDwtIGMoIjAiLCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IikKY29sbmFtZXMoZGFidHJhbXRvY29jbDJfcGNudHNfcmFuZCkgPC0gcGFzdGUobmFtZXMoY2VsbF9udW1zKSwgcmVwKCctJyxsZW5ndGgoY2VsbF9udW1zKSksIGNlbGxfbnVtcywgcmVwKCdjZWxscycsIGxlbmd0aChjZWxsX251bXMpKSkKZGFidHJhbXRvY29jbDJfcGNudHNfcmFuZCA8LSBkYWJ0cmFtdG9jb2NsMl9wY250c19yYW5kWyxwJHRyZWVfY29sJG9yZGVyXQpwaGVhdG1hcChkYWJ0cmFtdG9jb2NsMl9wY250c19yYW5kLGNsdXN0ZXJfcm93cyA9IEYsIGNvbG9yID0gaW5mZXJubygxMSksIG1haW4gPSAiRGFiVHJhbSB0byBDb0NsMiBSYW5kIiwgYnJlYWtzID0gYnJlYWtzLCBjbHVzdGVyX2NvbHMgPSBGKQoKIyBEYWJUcmFtIHRvIENpcwpkYWJ0cmFtdG9jaXNfcGNudHMgPC0gYXMuZGF0YS5mcmFtZShzYXBwbHkoZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9saXN0LCAnW1snLCAzKSkKY2VsbF9udW1zIDwtIHNhcHBseShkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpCnJvd25hbWVzKGRhYnRyYW10b2Npc19wY250cykgPC0gYygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIpCmNvbG5hbWVzKGRhYnRyYW10b2Npc19wY250cykgPC0gcGFzdGUobmFtZXMoY2VsbF9udW1zKSwgcmVwKCctJyxsZW5ndGgoY2VsbF9udW1zKSksIGNlbGxfbnVtcywgcmVwKCdjZWxscycsIGxlbmd0aChjZWxsX251bXMpKSkKcCA8LSBwaGVhdG1hcChkYWJ0cmFtdG9jaXNfcGNudHMsY2x1c3Rlcl9yb3dzID0gRiwgY29sb3IgPSBpbmZlcm5vKDExKSwgbWFpbiA9ICJEYWJUcmFtIHRvIENpcyIsIGJyZWFrcyA9IGJyZWFrcykKcAoKZGFidHJhbXRvY2lzX3BjbnRzX3JhbmQgPC0gYXMuZGF0YS5mcmFtZShSZWR1Y2UoYCtgLCBsYXBwbHkoZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3QsIGZ1bmN0aW9uKHgpIHsKICBzYXBwbHkoeCwgZnVuY3Rpb24oeSkgeSRQY250X2NlbGxzKQp9KSkvIGxlbmd0aChkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdCkpCnJvd25hbWVzKGRhYnRyYW10b2Npc19wY250c19yYW5kKSA8LSBjKCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IikKY29sbmFtZXMoZGFidHJhbXRvY2lzX3BjbnRzX3JhbmQpIDwtIHBhc3RlKG5hbWVzKGNlbGxfbnVtcyksIHJlcCgnLScsbGVuZ3RoKGNlbGxfbnVtcykpLCBjZWxsX251bXMsIHJlcCgnY2VsbHMnLCBsZW5ndGgoY2VsbF9udW1zKSkpCmRhYnRyYW10b2Npc19wY250c19yYW5kIDwtIGRhYnRyYW10b2Npc19wY250c19yYW5kWyxwJHRyZWVfY29sJG9yZGVyXQpwaGVhdG1hcChkYWJ0cmFtdG9jaXNfcGNudHNfcmFuZCxjbHVzdGVyX3Jvd3MgPSBGLCBjb2xvciA9IGluZmVybm8oMTEpLCBtYWluID0gIkRhYlRyYW0gdG8gQ2lzIFJhbmQiLCBicmVha3MgPSBicmVha3MsIGNsdXN0ZXJfY29scyA9IEYpCgojIENvQ2wyIG9iamVjdHMKY29jbDJfcGNudHMgPC0gYXMuZGF0YS5mcmFtZShzYXBwbHkoY29jbDJfbGluX2NsdXN0X2xpc3QsICdbWycsIDMpKQpjZWxsX251bXMgPC0gc2FwcGx5KGNvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKQpyb3duYW1lcyhjb2NsMl9wY250cykgPC0gYygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IikKY29sbmFtZXMoY29jbDJfcGNudHMpIDwtIHBhc3RlKG5hbWVzKGNlbGxfbnVtcyksIHJlcCgnLScsbGVuZ3RoKGNlbGxfbnVtcykpLCBjZWxsX251bXMsIHJlcCgnY2VsbHMnLCBsZW5ndGgoY2VsbF9udW1zKSkpCnAgPC0gcGhlYXRtYXAoY29jbDJfcGNudHMsY2x1c3Rlcl9yb3dzID0gRiwgY29sb3IgPSBpbmZlcm5vKDExKSwgbWFpbiA9ICJDb0NsMiIsIGJyZWFrcyA9IGJyZWFrcykKcAoKY29jbDJfcGNudHNfcmFuZCA8LSBhcy5kYXRhLmZyYW1lKFJlZHVjZShgK2AsIGxhcHBseShjb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0LCBmdW5jdGlvbih4KSB7CiAgc2FwcGx5KHgsIGZ1bmN0aW9uKHkpIHkkUGNudF9jZWxscykKfSkpLyBsZW5ndGgoY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCkpCnJvd25hbWVzKGNvY2wyX3BjbnRzX3JhbmQpIDwtIGMoIjAiLCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIpCmNvbG5hbWVzKGNvY2wyX3BjbnRzX3JhbmQpIDwtIHBhc3RlKG5hbWVzKGNlbGxfbnVtcyksIHJlcCgnLScsbGVuZ3RoKGNlbGxfbnVtcykpLCBjZWxsX251bXMsIHJlcCgnY2VsbHMnLCBsZW5ndGgoY2VsbF9udW1zKSkpCmNvY2wyX3BjbnRzX3JhbmQgPC0gY29jbDJfcGNudHNfcmFuZFsscCR0cmVlX2NvbCRvcmRlcl0KcGhlYXRtYXAoY29jbDJfcGNudHNfcmFuZCxjbHVzdGVyX3Jvd3MgPSBGLCBjb2xvciA9IGluZmVybm8oMTEpLCBtYWluID0gIkNvQ2wyIFJhbmQiLCBicmVha3MgPSBicmVha3MsIGNsdXN0ZXJfY29scyA9IEYpCgojIENvQ2wyIHRvIERhYlRyYW0KY29jbDJ0b2RhYnRyYW1fcGNudHMgPC0gYXMuZGF0YS5mcmFtZShzYXBwbHkoY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X2xpc3QsICdbWycsIDMpKQpjZWxsX251bXMgPC0gc2FwcGx5KGNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKQpyb3duYW1lcyhjb2NsMnRvZGFidHJhbV9wY250cykgPC0gYygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIpCmNvbG5hbWVzKGNvY2wydG9kYWJ0cmFtX3BjbnRzKSA8LSBwYXN0ZShuYW1lcyhjZWxsX251bXMpLCByZXAoJy0nLGxlbmd0aChjZWxsX251bXMpKSwgY2VsbF9udW1zLCByZXAoJ2NlbGxzJywgbGVuZ3RoKGNlbGxfbnVtcykpKQpwIDwtIHBoZWF0bWFwKGNvY2wydG9kYWJ0cmFtX3BjbnRzLGNsdXN0ZXJfcm93cyA9IEYsIGNvbG9yID0gaW5mZXJubygxMSksIG1haW4gPSAiQ29DbDIgdG8gRGFiVHJhbSIsIGJyZWFrcyA9IGJyZWFrcykKcAoKY29jbDJ0b2RhYnRyYW1fcGNudHNfcmFuZCA8LSBhcy5kYXRhLmZyYW1lKFJlZHVjZShgK2AsIGxhcHBseShjb2NsMnRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0LCBmdW5jdGlvbih4KSB7CiAgc2FwcGx5KHgsIGZ1bmN0aW9uKHkpIHkkUGNudF9jZWxscykKfSkpLyBsZW5ndGgoY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCkpCnJvd25hbWVzKGNvY2wydG9kYWJ0cmFtX3BjbnRzX3JhbmQpIDwtIGMoIjAiLCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiKQpjb2xuYW1lcyhjb2NsMnRvZGFidHJhbV9wY250c19yYW5kKSA8LSBwYXN0ZShuYW1lcyhjZWxsX251bXMpLCByZXAoJy0nLGxlbmd0aChjZWxsX251bXMpKSwgY2VsbF9udW1zLCByZXAoJ2NlbGxzJywgbGVuZ3RoKGNlbGxfbnVtcykpKQpjb2NsMnRvZGFidHJhbV9wY250c19yYW5kIDwtIGNvY2wydG9kYWJ0cmFtX3BjbnRzX3JhbmRbLHAkdHJlZV9jb2wkb3JkZXJdCnBoZWF0bWFwKGNvY2wydG9kYWJ0cmFtX3BjbnRzX3JhbmQsY2x1c3Rlcl9yb3dzID0gRiwgY29sb3IgPSBpbmZlcm5vKDExKSwgbWFpbiA9ICJDb0NsMiB0byBEYWJUcmFtIFJhbmQiLCBicmVha3MgPSBicmVha3MsIGNsdXN0ZXJfY29scyA9IEYpCgojIENvQ2wyIHRvIENvQ2wyCmNvY2wydG9jb2NsMl9wY250cyA8LSBhcy5kYXRhLmZyYW1lKHNhcHBseShjb2NsMnRvY29jbDJfbGluX2NsdXN0X2xpc3QsICdbWycsIDMpKQpjZWxsX251bXMgPC0gc2FwcGx5KGNvY2wydG9jb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkKcm93bmFtZXMoY29jbDJ0b2NvY2wyX3BjbnRzKSA8LSBjKCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiKQpjb2xuYW1lcyhjb2NsMnRvY29jbDJfcGNudHMpIDwtIHBhc3RlKG5hbWVzKGNlbGxfbnVtcyksIHJlcCgnLScsbGVuZ3RoKGNlbGxfbnVtcykpLCBjZWxsX251bXMsIHJlcCgnY2VsbHMnLCBsZW5ndGgoY2VsbF9udW1zKSkpCnAgPC0gcGhlYXRtYXAoY29jbDJ0b2NvY2wyX3BjbnRzLGNsdXN0ZXJfcm93cyA9IEYsIGNvbG9yID0gaW5mZXJubygxMSksIG1haW4gPSAiQ29DbDIgdG8gQ29DbDIiLCBicmVha3MgPSBicmVha3MpCnAKCmNvY2wydG9jb2NsMl9wY250c19yYW5kIDwtIGFzLmRhdGEuZnJhbWUoUmVkdWNlKGArYCwgbGFwcGx5KGNvY2wydG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0LCBmdW5jdGlvbih4KSB7CiAgc2FwcGx5KHgsIGZ1bmN0aW9uKHkpIHkkUGNudF9jZWxscykKfSkpLyBsZW5ndGgoY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3QpKQpyb3duYW1lcyhjb2NsMnRvY29jbDJfcGNudHNfcmFuZCkgPC0gYygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IikKY29sbmFtZXMoY29jbDJ0b2NvY2wyX3BjbnRzX3JhbmQpIDwtIHBhc3RlKG5hbWVzKGNlbGxfbnVtcyksIHJlcCgnLScsbGVuZ3RoKGNlbGxfbnVtcykpLCBjZWxsX251bXMsIHJlcCgnY2VsbHMnLCBsZW5ndGgoY2VsbF9udW1zKSkpCmNvY2wydG9jb2NsMl9wY250c19yYW5kIDwtIGNvY2wydG9jb2NsMl9wY250c19yYW5kWyxwJHRyZWVfY29sJG9yZGVyXQpwaGVhdG1hcChjb2NsMnRvY29jbDJfcGNudHNfcmFuZCxjbHVzdGVyX3Jvd3MgPSBGLCBjb2xvciA9IGluZmVybm8oMTEpLCBtYWluID0gIkNvQ2wyIHRvIENvQ2wyIFJhbmQiLCBicmVha3MgPSBicmVha3MsIGNsdXN0ZXJfY29scyA9IEYpCgojIENvQ2wyIHRvIENpcwpjb2NsMnRvY2lzX3BjbnRzIDwtIGFzLmRhdGEuZnJhbWUoc2FwcGx5KGNvY2wydG9jaXNfbGluX2NsdXN0X2xpc3QsICdbWycsIDMpKQpjZWxsX251bXMgPC0gc2FwcGx5KGNvY2wydG9jaXNfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpCnJvd25hbWVzKGNvY2wydG9jaXNfcGNudHMpIDwtIGMoIjAiLCIxIiwiMiIsIjMiLCI0IiwiNSIpCmNvbG5hbWVzKGNvY2wydG9jaXNfcGNudHMpIDwtIHBhc3RlKG5hbWVzKGNlbGxfbnVtcyksIHJlcCgnLScsbGVuZ3RoKGNlbGxfbnVtcykpLCBjZWxsX251bXMsIHJlcCgnY2VsbHMnLCBsZW5ndGgoY2VsbF9udW1zKSkpCnAgPC0gcGhlYXRtYXAoY29jbDJ0b2Npc19wY250cyxjbHVzdGVyX3Jvd3MgPSBGLCBjb2xvciA9IGluZmVybm8oMTEpLCBtYWluID0gIkNvQ2wyIHRvIENpcyIsIGJyZWFrcyA9IGJyZWFrcykKcAoKY29jbDJ0b2Npc19wY250c19yYW5kIDwtIGFzLmRhdGEuZnJhbWUoUmVkdWNlKGArYCwgbGFwcGx5KGNvY2wydG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdCwgZnVuY3Rpb24oeCkgewogIHNhcHBseSh4LCBmdW5jdGlvbih5KSB5JFBjbnRfY2VsbHMpCn0pKS8gbGVuZ3RoKGNvY2wydG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdCkpCnJvd25hbWVzKGNvY2wydG9jaXNfcGNudHNfcmFuZCkgPC0gYygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IikKY29sbmFtZXMoY29jbDJ0b2Npc19wY250c19yYW5kKSA8LSBwYXN0ZShuYW1lcyhjZWxsX251bXMpLCByZXAoJy0nLGxlbmd0aChjZWxsX251bXMpKSwgY2VsbF9udW1zLCByZXAoJ2NlbGxzJywgbGVuZ3RoKGNlbGxfbnVtcykpKQpjb2NsMnRvY2lzX3BjbnRzX3JhbmQgPC0gY29jbDJ0b2Npc19wY250c19yYW5kWyxwJHRyZWVfY29sJG9yZGVyXQpwaGVhdG1hcChjb2NsMnRvY2lzX3BjbnRzX3JhbmQsY2x1c3Rlcl9yb3dzID0gRiwgY29sb3IgPSBpbmZlcm5vKDExKSwgbWFpbiA9ICJDb0NsMiB0byBDaXMgUmFuZCIsIGJyZWFrcyA9IGJyZWFrcywgY2x1c3Rlcl9jb2xzID0gRikKCiMgQ2lzIApjaXNfcGNudHMgPC0gYXMuZGF0YS5mcmFtZShzYXBwbHkoY2lzX2xpbl9jbHVzdF9saXN0LCAnW1snLCAzKSkKY2VsbF9udW1zIDwtIHNhcHBseShjaXNfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpCnJvd25hbWVzKGNpc19wY250cykgPC0gYygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKQpjb2xuYW1lcyhjaXNfcGNudHMpIDwtIHBhc3RlKG5hbWVzKGNlbGxfbnVtcyksIHJlcCgnLScsbGVuZ3RoKGNlbGxfbnVtcykpLCBjZWxsX251bXMsIHJlcCgnY2VsbHMnLCBsZW5ndGgoY2VsbF9udW1zKSkpCnAgPC0gcGhlYXRtYXAoY2lzX3BjbnRzLGNsdXN0ZXJfcm93cyA9IEYsIGNvbG9yID0gaW5mZXJubygxMCksIG1haW4gPSAiQ2lzIiwgYnJlYWtzID0gYnJlYWtzKQpwCgpjaXNfcGNudHNfcmFuZCA8LSBhcy5kYXRhLmZyYW1lKFJlZHVjZShgK2AsIGxhcHBseShjaXNfbGluX2NsdXN0X3JhbmRfbGlzdCwgZnVuY3Rpb24oeCkgewogIHNhcHBseSh4LCBmdW5jdGlvbih5KSB5JFBjbnRfY2VsbHMpCn0pKS8gbGVuZ3RoKGNpc19saW5fY2x1c3RfcmFuZF9saXN0KSkKcm93bmFtZXMoY2lzX3BjbnRzX3JhbmQpIDwtIGMoIjAiLCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IikKY29sbmFtZXMoY2lzX3BjbnRzX3JhbmQpIDwtIHBhc3RlKG5hbWVzKGNlbGxfbnVtcyksIHJlcCgnLScsbGVuZ3RoKGNlbGxfbnVtcykpLCBjZWxsX251bXMsIHJlcCgnY2VsbHMnLCBsZW5ndGgoY2VsbF9udW1zKSkpCmNpc19wY250c19yYW5kIDwtIGNpc19wY250c19yYW5kWyxwJHRyZWVfY29sJG9yZGVyXQpwaGVhdG1hcChjaXNfcGNudHNfcmFuZCxjbHVzdGVyX3Jvd3MgPSBGLCBjb2xvciA9IGluZmVybm8oMTEpLCBtYWluID0gIkNpcyBSYW5kIiwgYnJlYWtzID0gYnJlYWtzLCBjbHVzdGVyX2NvbHMgPSBGKQoKIyBDaXMgdG8gRGFiVHJhbQpjaXN0b2RhYnRyYW1fcGNudHMgPC0gYXMuZGF0YS5mcmFtZShzYXBwbHkoY2lzdG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCAnW1snLCAzKSkKY2VsbF9udW1zIDwtIHNhcHBseShjaXN0b2RhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpCnJvd25hbWVzKGNpc3RvZGFidHJhbV9wY250cykgPC0gYygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKQpjb2xuYW1lcyhjaXN0b2RhYnRyYW1fcGNudHMpIDwtIHBhc3RlKG5hbWVzKGNlbGxfbnVtcyksIHJlcCgnLScsbGVuZ3RoKGNlbGxfbnVtcykpLCBjZWxsX251bXMsIHJlcCgnY2VsbHMnLCBsZW5ndGgoY2VsbF9udW1zKSkpCnAgPC0gcGhlYXRtYXAoY2lzdG9kYWJ0cmFtX3BjbnRzLGNsdXN0ZXJfcm93cyA9IEYsIGNvbG9yID0gaW5mZXJubygxMSksIG1haW4gPSAiQ2lzIHRvIERhYlRyYW0iLCBicmVha3MgPSBicmVha3MpCnAKCmNpc3RvZGFidHJhbV9wY250c19yYW5kIDwtIGFzLmRhdGEuZnJhbWUoUmVkdWNlKGArYCwgbGFwcGx5KGNpc3RvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0LCBmdW5jdGlvbih4KSB7CiAgc2FwcGx5KHgsIGZ1bmN0aW9uKHkpIHkkUGNudF9jZWxscykKfSkpLyBsZW5ndGgoY2lzdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3QpKQpyb3duYW1lcyhjaXN0b2RhYnRyYW1fcGNudHNfcmFuZCkgPC0gYygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKQpjb2xuYW1lcyhjaXN0b2RhYnRyYW1fcGNudHNfcmFuZCkgPC0gcGFzdGUobmFtZXMoY2VsbF9udW1zKSwgcmVwKCctJyxsZW5ndGgoY2VsbF9udW1zKSksIGNlbGxfbnVtcywgcmVwKCdjZWxscycsIGxlbmd0aChjZWxsX251bXMpKSkKY2lzdG9kYWJ0cmFtX3BjbnRzX3JhbmQgPC0gY2lzdG9kYWJ0cmFtX3BjbnRzX3JhbmRbLHAkdHJlZV9jb2wkb3JkZXJdCnBoZWF0bWFwKGNpc3RvZGFidHJhbV9wY250c19yYW5kLGNsdXN0ZXJfcm93cyA9IEYsIGNvbG9yID0gaW5mZXJubygxMSksIG1haW4gPSAiQ2lzIHRvIERhYlRyYW0gUmFuZCIsIGJyZWFrcyA9IGJyZWFrcywgY2x1c3Rlcl9jb2xzID0gRikKCiMgQ2lzIHRvIENvQ2wyCmNpc3RvY29jbDJfcGNudHMgPC0gYXMuZGF0YS5mcmFtZShzYXBwbHkoY2lzdG9jb2NsMl9saW5fY2x1c3RfbGlzdCwgJ1tbJywgMykpCmNlbGxfbnVtcyA8LSBzYXBwbHkoY2lzdG9jb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkKcm93bmFtZXMoY2lzdG9jb2NsMl9wY250cykgPC0gYygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIpCmNvbG5hbWVzKGNpc3RvY29jbDJfcGNudHMpIDwtIHBhc3RlKG5hbWVzKGNlbGxfbnVtcyksIHJlcCgnLScsbGVuZ3RoKGNlbGxfbnVtcykpLCBjZWxsX251bXMsIHJlcCgnY2VsbHMnLCBsZW5ndGgoY2VsbF9udW1zKSkpCnAgPC0gcGhlYXRtYXAoY2lzdG9jb2NsMl9wY250cyxjbHVzdGVyX3Jvd3MgPSBGLCBjb2xvciA9IGluZmVybm8oMTEpLCBtYWluID0gIkNpcyB0byBDb0NsMiIsIGJyZWFrcyA9IGJyZWFrcykKcAoKY2lzdG9jb2NsMl9wY250c19yYW5kIDwtIGFzLmRhdGEuZnJhbWUoUmVkdWNlKGArYCwgbGFwcGx5KGNpc3RvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCwgZnVuY3Rpb24oeCkgewogIHNhcHBseSh4LCBmdW5jdGlvbih5KSB5JFBjbnRfY2VsbHMpCn0pKS8gbGVuZ3RoKGNpc3RvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCkpCnJvd25hbWVzKGNpc3RvY29jbDJfcGNudHNfcmFuZCkgPC0gYygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIpCmNvbG5hbWVzKGNpc3RvY29jbDJfcGNudHNfcmFuZCkgPC0gcGFzdGUobmFtZXMoY2VsbF9udW1zKSwgcmVwKCctJyxsZW5ndGgoY2VsbF9udW1zKSksIGNlbGxfbnVtcywgcmVwKCdjZWxscycsIGxlbmd0aChjZWxsX251bXMpKSkKY2lzdG9jb2NsMl9wY250c19yYW5kIDwtIGNpc3RvY29jbDJfcGNudHNfcmFuZFsscCR0cmVlX2NvbCRvcmRlcl0KcGhlYXRtYXAoY2lzdG9jb2NsMl9wY250c19yYW5kLGNsdXN0ZXJfcm93cyA9IEYsIGNvbG9yID0gaW5mZXJubygxMSksIG1haW4gPSAiQ2lzIHRvIENvQ2wyIFJhbmQiLCBicmVha3MgPSBicmVha3MsIGNsdXN0ZXJfY29scyA9IEYpCgojIENpcyB0byBDaXMKY2lzdG9jaXNfcGNudHMgPC0gYXMuZGF0YS5mcmFtZShzYXBwbHkoY2lzdG9jaXNfbGluX2NsdXN0X2xpc3QsICdbWycsIDMpKQpjZWxsX251bXMgPC0gc2FwcGx5KGNpc3RvY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKQpyb3duYW1lcyhjaXN0b2Npc19wY250cykgPC0gYygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IikKY29sbmFtZXMoY2lzdG9jaXNfcGNudHMpIDwtIHBhc3RlKG5hbWVzKGNlbGxfbnVtcyksIHJlcCgnLScsbGVuZ3RoKGNlbGxfbnVtcykpLCBjZWxsX251bXMsIHJlcCgnY2VsbHMnLCBsZW5ndGgoY2VsbF9udW1zKSkpCnAgPC0gcGhlYXRtYXAoY2lzdG9jaXNfcGNudHMsY2x1c3Rlcl9yb3dzID0gRiwgY29sb3IgPSBpbmZlcm5vKDExKSwgbWFpbiA9ICJDaXMgdG8gQ2lzIiwgYnJlYWtzID0gYnJlYWtzKQpwCgpjaXN0b2Npc19wY250c19yYW5kIDwtIGFzLmRhdGEuZnJhbWUoUmVkdWNlKGArYCwgbGFwcGx5KGNpc3RvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3QsIGZ1bmN0aW9uKHgpIHsKICBzYXBwbHkoeCwgZnVuY3Rpb24oeSkgeSRQY250X2NlbGxzKQp9KSkvIGxlbmd0aChjaXN0b2Npc19saW5fY2x1c3RfcmFuZF9saXN0KSkKcm93bmFtZXMoY2lzdG9jaXNfcGNudHNfcmFuZCkgPC0gYygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IikKY29sbmFtZXMoY2lzdG9jaXNfcGNudHNfcmFuZCkgPC0gcGFzdGUobmFtZXMoY2VsbF9udW1zKSwgcmVwKCctJyxsZW5ndGgoY2VsbF9udW1zKSksIGNlbGxfbnVtcywgcmVwKCdjZWxscycsIGxlbmd0aChjZWxsX251bXMpKSkKY2lzdG9jaXNfcGNudHNfcmFuZCA8LSBjaXN0b2Npc19wY250c19yYW5kWyxwJHRyZWVfY29sJG9yZGVyXQpwaGVhdG1hcChjaXN0b2Npc19wY250c19yYW5kLGNsdXN0ZXJfcm93cyA9IEYsIGNvbG9yID0gaW5mZXJubygxMSksIG1haW4gPSAiQ2lzIHRvIENpcyBSYW5kIiwgYnJlYWtzID0gYnJlYWtzLCBjbHVzdGVyX2NvbHMgPSBGKQpkZXYub2ZmKCkKCmBgYAoKIyBwbG90IHRoZSBkaWZmZXJlbnQgdGVzdCBzdGF0aXN0aWNzIC0gaGlzdG9ncmFtIG9mIHdlaWdodGVkIG1lYW5zIG9mIG1heGltdW0gY29udHJpYnV0aW9uIHRvIGxpbmVhZ2UgdnMgdHJ1ZQpgYGB7cn0KCnBkZignMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL3dlaWdodGVkX21lYW5fY2x1c3Rlcl9hc3NpZ25tZW50c190ZXN0X3N0YXRzLnBkZicpCiMgRGFiVHJhbQojIEZpbmQgdGhlIHdlaWdodGVkIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgp3bWVhbiA8LSB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoZGFidHJhbV9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKdW5saXN0KGxhcHBseShkYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCmRmIDwtIGRhdGEuZnJhbWUod2VpZ2h0ZWRfbWVhbiA9IHNhcHBseSgxOmxlbmd0aChkYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShkYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkpKQoKZ2dwbG90KGRmLCBhZXMoeCA9IHdlaWdodGVkX21lYW4pKStnZW9tX2hpc3RvZ3JhbShmaWxsID0gJyM2MjM1OTQnLCBjb2xvciA9ICdibGFjaycsIGJpbndpZHRoID0gMC4wMDUpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gd21lYW4sIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbG9yID0gJ3JlZCcpICsgZ2VvbV90ZXh0KGFlcyh4ID0gd21lYW4rLjAzLCBsYWJlbCA9IHJvdW5kKHdtZWFuLCAzKSwgeSA9IDUwMCksIGNvbG9yID0gJ3JlZCcpICsgbGFicyh5ID0gJ051bWJlciBvZiBzaW11bGF0aW9ucycsIHggPSAnV2VpZ2h0ZWQgbWVhbiBvZiBwZXJjZW50IG9mIGNlbGxzIGluIGRvbWluYW50IGxpbmVhZ2UnLCB0aXRsZSA9ICdEYWJUcmFtJykgKyB4bGltKDAuMTUsIDAuNjUpICsgeWxpbSgwLDg1MCkgKyBnZW9tX3RleHQoYWVzKHggPSB3bWVhbisuMDMsIGxhYmVsID0gJ09ic2VydmVkJywgeSA9IDUyNSksIGNvbG9yID0gJ3JlZCcpICsgdGhlbWVfY2xhc3NpYygpCgojIERhYlRyYW0gdG8gRGFiVHJhbQojIEZpbmQgdGhlIHdlaWdodGVkIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgp3bWVhbiA8LSB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKdW5saXN0KGxhcHBseShkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCmRmIDwtIGRhdGEuZnJhbWUod2VpZ2h0ZWRfbWVhbiA9IHNhcHBseSgxOmxlbmd0aChkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkpKQoKZ2dwbG90KGRmLCBhZXMoeCA9IHdlaWdodGVkX21lYW4pKStnZW9tX2hpc3RvZ3JhbShmaWxsID0gJyM1NjFlNTknLCBjb2xvciA9ICdibGFjaycsIGJpbndpZHRoID0gMC4wMDUpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gd21lYW4sIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbG9yID0gJ3JlZCcpICsgZ2VvbV90ZXh0KGFlcyh4ID0gd21lYW4rLjAzLCBsYWJlbCA9IHJvdW5kKHdtZWFuLCAzKSwgeSA9IDUwMCksIGNvbG9yID0gJ3JlZCcpICsgbGFicyh5ID0gJ051bWJlciBvZiBzaW11bGF0aW9ucycsIHggPSAnV2VpZ2h0ZWQgbWVhbiBvZiBwZXJjZW50IG9mIGNlbGxzIGluIGRvbWluYW50IGxpbmVhZ2UnLCB0aXRsZSA9ICdEYWJUcmFtIHRvIERhYlRyYW0nKSArIHhsaW0oMC4xNSwgMC42NSkgKyB5bGltKDAsODUwKSArIGdlb21fdGV4dChhZXMoeCA9IHdtZWFuKy4wMywgbGFiZWwgPSAnT2JzZXJ2ZWQnLCB5ID0gNTI1KSwgY29sb3IgPSAncmVkJykgKyB0aGVtZV9jbGFzc2ljKCkKCiMgRGFiVHJhbSB0byBDb0NsMgojIEZpbmQgdGhlIHdlaWdodGVkIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgp3bWVhbiA8LSB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCnVubGlzdChsYXBwbHkoZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkKZGYgPC0gZGF0YS5mcmFtZSh3ZWlnaHRlZF9tZWFuID0gc2FwcGx5KDE6bGVuZ3RoKGRhYnRyYW10b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShkYWJ0cmFtdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCiAgICAgICAgICAgICAgICB1bmxpc3QobGFwcGx5KGRhYnRyYW10b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkpCgpnZ3Bsb3QoZGYsIGFlcyh4ID0gd2VpZ2h0ZWRfbWVhbikpK2dlb21faGlzdG9ncmFtKGZpbGwgPSAnI0EyMjQ4RScsIGNvbG9yID0gJ2JsYWNrJywgYmlud2lkdGggPSAwLjAwNSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB3bWVhbiwgbGluZXR5cGUgPSAnZGFzaGVkJywgY29sb3IgPSAncmVkJykgKyBnZW9tX3RleHQoYWVzKHggPSB3bWVhbisuMDMsIGxhYmVsID0gcm91bmQod21lYW4sIDMpLCB5ID0gNTAwKSwgY29sb3IgPSAncmVkJykgKyBsYWJzKHkgPSAnTnVtYmVyIG9mIHNpbXVsYXRpb25zJywgeCA9ICdXZWlnaHRlZCBtZWFuIG9mIHBlcmNlbnQgb2YgY2VsbHMgaW4gZG9taW5hbnQgbGluZWFnZScsIHRpdGxlID0gJ0RhYlRyYW0gdG8gQ29DbDInKSArIHhsaW0oMC4xNSwgMC42NSkgKyB5bGltKDAsODUwKSArIGdlb21fdGV4dChhZXMoeCA9IHdtZWFuKy4wMywgbGFiZWwgPSAnT2JzZXJ2ZWQnLCB5ID0gNTI1KSwgY29sb3IgPSAncmVkJykgKyB0aGVtZV9jbGFzc2ljKCkKCiMgRGFiVHJhbSB0byBDaXMKIyBGaW5kIHRoZSB3ZWlnaHRlZCBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24Kd21lYW4gPC0gd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGRhYnRyYW10b2Npc19saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKdW5saXN0KGxhcHBseShkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkKZGYgPC0gZGF0YS5mcmFtZSh3ZWlnaHRlZF9tZWFuID0gc2FwcGx5KDE6bGVuZ3RoKGRhYnRyYW10b2Npc19saW5fY2x1c3RfcmFuZF9saXN0KSwgZnVuY3Rpb24oeSkKICB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkpCgpnZ3Bsb3QoZGYsIGFlcyh4ID0gd2VpZ2h0ZWRfbWVhbikpK2dlb21faGlzdG9ncmFtKGZpbGwgPSAnIzlEODVCRScsIGNvbG9yID0gJ2JsYWNrJywgYmlud2lkdGggPSAwLjAwNSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB3bWVhbiwgbGluZXR5cGUgPSAnZGFzaGVkJywgY29sb3IgPSAncmVkJykgKyBnZW9tX3RleHQoYWVzKHggPSB3bWVhbisuMDMsIGxhYmVsID0gcm91bmQod21lYW4sIDMpLCB5ID0gNTAwKSwgY29sb3IgPSAncmVkJykgKyBsYWJzKHkgPSAnTnVtYmVyIG9mIHNpbXVsYXRpb25zJywgeCA9ICdXZWlnaHRlZCBtZWFuIG9mIHBlcmNlbnQgb2YgY2VsbHMgaW4gZG9taW5hbnQgbGluZWFnZScsIHRpdGxlID0gJ0RhYlRyYW0gdG8gQ2lzJykgKyB4bGltKDAuMTUsIDAuNjUpICsgeWxpbSgwLDg1MCkgKyBnZW9tX3RleHQoYWVzKHggPSB3bWVhbisuMDMsIGxhYmVsID0gJ09ic2VydmVkJywgeSA9IDUyNSksIGNvbG9yID0gJ3JlZCcpICsgdGhlbWVfY2xhc3NpYygpCgojIENvQ2wyCiMgRmluZCB0aGUgd2VpZ2h0ZWQgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCndtZWFuIDwtIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKdW5saXN0KGxhcHBseShjb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKQpkZiA8LSBkYXRhLmZyYW1lKHdlaWdodGVkX21lYW4gPSBzYXBwbHkoMTpsZW5ndGgoY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpKSkKCmdncGxvdChkZiwgYWVzKHggPSB3ZWlnaHRlZF9tZWFuKSkrZ2VvbV9oaXN0b2dyYW0oZmlsbCA9ICcjMEY4MjQxJywgY29sb3IgPSAnYmxhY2snLCBiaW53aWR0aCA9IDAuMDA1KSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHdtZWFuLCBsaW5ldHlwZSA9ICdkYXNoZWQnLCBjb2xvciA9ICdyZWQnKSArIGdlb21fdGV4dChhZXMoeCA9IHdtZWFuKy4wMywgbGFiZWwgPSByb3VuZCh3bWVhbiwgMyksIHkgPSA1MDApLCBjb2xvciA9ICdyZWQnKSArIGxhYnMoeSA9ICdOdW1iZXIgb2Ygc2ltdWxhdGlvbnMnLCB4ID0gJ1dlaWdodGVkIG1lYW4gb2YgcGVyY2VudCBvZiBjZWxscyBpbiBkb21pbmFudCBsaW5lYWdlJywgdGl0bGUgPSAnQ29DbDInKSArIHhsaW0oMC4xNSwgMC42NSkgKyB5bGltKDAsODUwKSArIGdlb21fdGV4dChhZXMoeCA9IHdtZWFuKy4wMywgbGFiZWwgPSAnT2JzZXJ2ZWQnLCB5ID0gNTI1KSwgY29sb3IgPSAncmVkJykgKyB0aGVtZV9jbGFzc2ljKCkKCiMgQ29DbDIgdG8gRGFiVHJhbQojIEZpbmQgdGhlIHdlaWdodGVkIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgp3bWVhbiA8LSB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCnVubGlzdChsYXBwbHkoY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkKZGYgPC0gZGF0YS5mcmFtZSh3ZWlnaHRlZF9tZWFuID0gc2FwcGx5KDE6bGVuZ3RoKGNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjb2NsMnRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCiAgICAgICAgICAgICAgICB1bmxpc3QobGFwcGx5KGNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkpCgpnZ3Bsb3QoZGYsIGFlcyh4ID0gd2VpZ2h0ZWRfbWVhbikpK2dlb21faGlzdG9ncmFtKGZpbGwgPSAnIzEwNDEzQicsIGNvbG9yID0gJ2JsYWNrJywgYmlud2lkdGggPSAwLjAwNSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB3bWVhbiwgbGluZXR5cGUgPSAnZGFzaGVkJywgY29sb3IgPSAncmVkJykgKyBnZW9tX3RleHQoYWVzKHggPSB3bWVhbisuMDMsIGxhYmVsID0gcm91bmQod21lYW4sIDMpLCB5ID0gNTAwKSwgY29sb3IgPSAncmVkJykgKyBsYWJzKHkgPSAnTnVtYmVyIG9mIHNpbXVsYXRpb25zJywgeCA9ICdXZWlnaHRlZCBtZWFuIG9mIHBlcmNlbnQgb2YgY2VsbHMgaW4gZG9taW5hbnQgbGluZWFnZScsIHRpdGxlID0gJ0NvQ2wyIHRvIERhYlRyYW0nKSArIHhsaW0oMC4xNSwgMC42NSkgKyB5bGltKDAsODUwKSArIGdlb21fdGV4dChhZXMoeCA9IHdtZWFuKy4wMywgbGFiZWwgPSAnT2JzZXJ2ZWQnLCB5ID0gNTI1KSwgY29sb3IgPSAncmVkJykgKyB0aGVtZV9jbGFzc2ljKCkKCiMgQ29DbDIgdG8gQ29DbDIKIyBGaW5kIHRoZSB3ZWlnaHRlZCBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24Kd21lYW4gPC0gd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNvY2wydG9jb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKdW5saXN0KGxhcHBseShjb2NsMnRvY29jbDJfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkKZGYgPC0gZGF0YS5mcmFtZSh3ZWlnaHRlZF9tZWFuID0gc2FwcGx5KDE6bGVuZ3RoKGNvY2wydG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0KSwgZnVuY3Rpb24oeSkKICB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkpCgpnZ3Bsb3QoZGYsIGFlcyh4ID0gd2VpZ2h0ZWRfbWVhbikpK2dlb21faGlzdG9ncmFtKGZpbGwgPSAnIzZBQkQ0NScsIGNvbG9yID0gJ2JsYWNrJywgYmlud2lkdGggPSAwLjAwNSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB3bWVhbiwgbGluZXR5cGUgPSAnZGFzaGVkJywgY29sb3IgPSAncmVkJykgKyBnZW9tX3RleHQoYWVzKHggPSB3bWVhbisuMDMsIGxhYmVsID0gcm91bmQod21lYW4sIDMpLCB5ID0gNTAwKSwgY29sb3IgPSAncmVkJykgKyBsYWJzKHkgPSAnTnVtYmVyIG9mIHNpbXVsYXRpb25zJywgeCA9ICdXZWlnaHRlZCBtZWFuIG9mIHBlcmNlbnQgb2YgY2VsbHMgaW4gZG9taW5hbnQgbGluZWFnZScsIHRpdGxlID0gJ0NvQ2wyIHRvIENvQ2wyJykgKyB4bGltKDAuMTUsIDAuNjUpICsgeWxpbSgwLDg1MCkgKyBnZW9tX3RleHQoYWVzKHggPSB3bWVhbisuMDMsIGxhYmVsID0gJ09ic2VydmVkJywgeSA9IDUyNSksIGNvbG9yID0gJ3JlZCcpICsgdGhlbWVfY2xhc3NpYygpCgojIENvQ2wyIHRvIENpcwojIEZpbmQgdGhlIHdlaWdodGVkIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgp3bWVhbiA8LSB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoY29jbDJ0b2Npc19saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKdW5saXN0KGxhcHBseShjb2NsMnRvY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCmRmIDwtIGRhdGEuZnJhbWUod2VpZ2h0ZWRfbWVhbiA9IHNhcHBseSgxOmxlbmd0aChjb2NsMnRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjb2NsMnRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY29jbDJ0b2Npc19saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkpKQoKZ2dwbG90KGRmLCBhZXMoeCA9IHdlaWdodGVkX21lYW4pKStnZW9tX2hpc3RvZ3JhbShmaWxsID0gJyM2REM0OUMnLCBjb2xvciA9ICdibGFjaycsIGJpbndpZHRoID0gMC4wMDUpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gd21lYW4sIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbG9yID0gJ3JlZCcpICsgZ2VvbV90ZXh0KGFlcyh4ID0gd21lYW4rLjAzLCBsYWJlbCA9IHJvdW5kKHdtZWFuLCAzKSwgeSA9IDUwMCksIGNvbG9yID0gJ3JlZCcpICsgbGFicyh5ID0gJ051bWJlciBvZiBzaW11bGF0aW9ucycsIHggPSAnV2VpZ2h0ZWQgbWVhbiBvZiBwZXJjZW50IG9mIGNlbGxzIGluIGRvbWluYW50IGxpbmVhZ2UnLCB0aXRsZSA9ICdDb0NsMiB0byBDaXMnKSArIHhsaW0oMC4xNSwgMC42NSkgKyB5bGltKDAsODUwKSArIGdlb21fdGV4dChhZXMoeCA9IHdtZWFuKy4wMywgbGFiZWwgPSAnT2JzZXJ2ZWQnLCB5ID0gNTI1KSwgY29sb3IgPSAncmVkJykgKyB0aGVtZV9jbGFzc2ljKCkKCiMgQ2lzCiMgRmluZCB0aGUgd2VpZ2h0ZWQgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCndtZWFuIDwtIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjaXNfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCnVubGlzdChsYXBwbHkoY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCmRmIDwtIGRhdGEuZnJhbWUod2VpZ2h0ZWRfbWVhbiA9IHNhcHBseSgxOmxlbmd0aChjaXNfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNpc19saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCiAgICAgICAgICAgICAgICB1bmxpc3QobGFwcGx5KGNpc19saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkpKQoKZ2dwbG90KGRmLCBhZXMoeCA9IHdlaWdodGVkX21lYW4pKStnZW9tX2hpc3RvZ3JhbShmaWxsID0gJyNDOTZEMjknLCBjb2xvciA9ICdibGFjaycsIGJpbndpZHRoID0gMC4wMDUpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gd21lYW4sIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbG9yID0gJ3JlZCcpICsgZ2VvbV90ZXh0KGFlcyh4ID0gd21lYW4rLjAzLCBsYWJlbCA9IHJvdW5kKHdtZWFuLCAzKSwgeSA9IDUwMCksIGNvbG9yID0gJ3JlZCcpICsgbGFicyh5ID0gJ051bWJlciBvZiBzaW11bGF0aW9ucycsIHggPSAnV2VpZ2h0ZWQgbWVhbiBvZiBwZXJjZW50IG9mIGNlbGxzIGluIGRvbWluYW50IGxpbmVhZ2UnLCB0aXRsZSA9ICdDaXMnKSArIHhsaW0oMC4xNSwgMC42NSkgKyB5bGltKDAsODUwKSArIGdlb21fdGV4dChhZXMoeCA9IHdtZWFuKy4wMywgbGFiZWwgPSAnT2JzZXJ2ZWQnLCB5ID0gNTI1KSwgY29sb3IgPSAncmVkJykgKyB0aGVtZV9jbGFzc2ljKCkKCiMgQ2lzIHRvIERhYlRyYW0KIyBGaW5kIHRoZSB3ZWlnaHRlZCBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24Kd21lYW4gPC0gd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNpc3RvZGFidHJhbV9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKdW5saXN0KGxhcHBseShjaXN0b2RhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkKZGYgPC0gZGF0YS5mcmFtZSh3ZWlnaHRlZF9tZWFuID0gc2FwcGx5KDE6bGVuZ3RoKGNpc3RvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0KSwgZnVuY3Rpb24oeSkKICB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoY2lzdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY2lzdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkpCgpnZ3Bsb3QoZGYsIGFlcyh4ID0gd2VpZ2h0ZWRfbWVhbikpK2dlb21faGlzdG9ncmFtKGZpbGwgPSAnI0EyMzYyMicsIGNvbG9yID0gJ2JsYWNrJywgYmlud2lkdGggPSAwLjAwNSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB3bWVhbiwgbGluZXR5cGUgPSAnZGFzaGVkJywgY29sb3IgPSAncmVkJykgKyBnZW9tX3RleHQoYWVzKHggPSB3bWVhbisuMDMsIGxhYmVsID0gcm91bmQod21lYW4sIDMpLCB5ID0gNTAwKSwgY29sb3IgPSAncmVkJykgKyBsYWJzKHkgPSAnTnVtYmVyIG9mIHNpbXVsYXRpb25zJywgeCA9ICdXZWlnaHRlZCBtZWFuIG9mIHBlcmNlbnQgb2YgY2VsbHMgaW4gZG9taW5hbnQgbGluZWFnZScsIHRpdGxlID0gJ0NpcyB0byBEYWJUcmFtJykgKyB4bGltKDAuMTUsIDAuNjUpICsgeWxpbSgwLDg1MCkgKyBnZW9tX3RleHQoYWVzKHggPSB3bWVhbisuMDMsIGxhYmVsID0gJ09ic2VydmVkJywgeSA9IDUyNSksIGNvbG9yID0gJ3JlZCcpICsgdGhlbWVfY2xhc3NpYygpCgojIENpcyB0byBDb0NsMgojIEZpbmQgdGhlIHdlaWdodGVkIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgp3bWVhbiA8LSB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoY2lzdG9jb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKdW5saXN0KGxhcHBseShjaXN0b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCmRmIDwtIGRhdGEuZnJhbWUod2VpZ2h0ZWRfbWVhbiA9IHNhcHBseSgxOmxlbmd0aChjaXN0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjaXN0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY2lzdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkpKQoKZ2dwbG90KGRmLCBhZXMoeCA9IHdlaWdodGVkX21lYW4pKStnZW9tX2hpc3RvZ3JhbShmaWxsID0gJyNDOTZEMjknLCBjb2xvciA9ICdibGFjaycsIGJpbndpZHRoID0gMC4wMDUpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gd21lYW4sIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbG9yID0gJ3JlZCcpICsgZ2VvbV90ZXh0KGFlcyh4ID0gd21lYW4rLjAzLCBsYWJlbCA9IHJvdW5kKHdtZWFuLCAzKSwgeSA9IDUwMCksIGNvbG9yID0gJ3JlZCcpICsgbGFicyh5ID0gJ051bWJlciBvZiBzaW11bGF0aW9ucycsIHggPSAnV2VpZ2h0ZWQgbWVhbiBvZiBwZXJjZW50IG9mIGNlbGxzIGluIGRvbWluYW50IGxpbmVhZ2UnLCB0aXRsZSA9ICdDaXMgdG8gQ29DbDInKSArIHhsaW0oMC4xNSwgMC42NSkgKyB5bGltKDAsODUwKSArIGdlb21fdGV4dChhZXMoeCA9IHdtZWFuKy4wMywgbGFiZWwgPSAnT2JzZXJ2ZWQnLCB5ID0gNTI1KSwgY29sb3IgPSAncmVkJykgKyB0aGVtZV9jbGFzc2ljKCkKCiMgQ2lzIHRvIENpcwojIEZpbmQgdGhlIHdlaWdodGVkIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgp3bWVhbiA8LSB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoY2lzdG9jaXNfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCnVubGlzdChsYXBwbHkoY2lzdG9jaXNfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkKZGYgPC0gZGF0YS5mcmFtZSh3ZWlnaHRlZF9tZWFuID0gc2FwcGx5KDE6bGVuZ3RoKGNpc3RvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjaXN0b2Npc19saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCiAgICAgICAgICAgICAgICB1bmxpc3QobGFwcGx5KGNpc3RvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkpCgpnZ3Bsb3QoZGYsIGFlcyh4ID0gd2VpZ2h0ZWRfbWVhbikpK2dlb21faGlzdG9ncmFtKGZpbGwgPSAnI0ZCRDA4QycsIGNvbG9yID0gJ2JsYWNrJywgYmlud2lkdGggPSAwLjAwNSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB3bWVhbiwgbGluZXR5cGUgPSAnZGFzaGVkJywgY29sb3IgPSAncmVkJykgKyBnZW9tX3RleHQoYWVzKHggPSB3bWVhbisuMDMsIGxhYmVsID0gcm91bmQod21lYW4sIDMpLCB5ID0gNTAwKSwgY29sb3IgPSAncmVkJykgKyBsYWJzKHkgPSAnTnVtYmVyIG9mIHNpbXVsYXRpb25zJywgeCA9ICdXZWlnaHRlZCBtZWFuIG9mIHBlcmNlbnQgb2YgY2VsbHMgaW4gZG9taW5hbnQgbGluZWFnZScsIHRpdGxlID0gJ0NpcyB0byBDaXMnKSArIHhsaW0oMC4xNSwgMC42NSkgKyB5bGltKDAsODUwKSArIGdlb21fdGV4dChhZXMoeCA9IHdtZWFuKy4wMywgbGFiZWwgPSAnT2JzZXJ2ZWQnLCB5ID0gNTI1KSwgY29sb3IgPSAncmVkJykgKyB0aGVtZV9jbGFzc2ljKCkKZGV2Lm9mZigpCgpgYGAKCgoK